docker 环境如何进行gdb调试

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值