docker 环境如何进行gdb调试

场景

程序跑在docker容器中,运行过程中出现问题,目前只能通过打印日志分析。想通过gdb进行调试,该如何操作

添加gdb工具

在构建docker镜像时,添加gdb软件,将gdb软件构建到你的docker镜像中

修改程序编译选项

程序编译时使用 '-g’或者 ‘-ggdb’ (c++),让编译出来的二进制文件包含调试信息
注意,在最后打包install时,一定不要使用strip工具又将调试信息删除了

运行容器时设置好ulimit

  • 运行docker镜像,假设镜像名称为’nginx_image’,运行后的容器名称为 ‘nginx_test’
docker run -it -d --name=nginx_test --ulimit core=-1 nginx_image bash

其中 -ulimit core=-1 用于设置docker容器对core文件的大小没有限制。
其中 bash 用于设置docker容器的主进程时bash,这样当你要调试的程序挂掉,容器也不会退出。

测试生成core

  • 进入容器shell
docker exec -it nginx_test /bin/sh
  • 查看core文件路径
cat /proc/sys/kernel/core_pattern
  • 杀死当前shell
kill -s SIGSEGV $$
  • 再次进入容器,查看是否有coredump文件

调试方法

将core文件拷贝到宿主机进行调试

当我们无法对docker镜像添加gdb软件时,可以使用这种方法。
另外,还需要宿主机的环境(架构)与docker镜像的环境一致,不然coredump文件也是无法读取的。

  • 如何将coredump文件拷贝出来
docker cp nginx_test:/home/core.1 .

直接在docker容器中调试

使用前面进入容器shell的方法,进入容器shell终端,使用gdb进行调试

docker exec -it nginx_test /bin/sh
gdb -c core.1 /bin/nginx
Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐