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