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
本文详细介绍了如何在Docker容器中使用GDB进行调试,包括在构建镜像时添加GDB工具、修改程序编译选项以保留调试信息、设置ulimit以允许核心文件生成,以及在容器内外拷贝和使用coredump进行调试的方法。
1564

被折叠的 条评论
为什么被折叠?



