美文网首页
Docker调试手段

Docker调试手段

作者: marshalzxy | 来源:发表于2018-09-20 15:10 被阅读59次

1、触发docker生成coredump文件

使用gcore -p pid -o dumpfile

常规情况下因为go语言不会生出coredump文件。gcore是gdb包中自带的工具

2、通过信号触发dockerd和containerd自己的dump stack功能

kill -s USR1 $(pidof dockerd)

上述命令可以将docker stack打印到docke的日志中。

docker打印的stack比较难看,必须通过格式梳理

3、gdb调试docker

1)对于docker-engine调试,因为编译时候使用了-ldflag “-w -s” ,其中-w的意思是生成最终的elf文件时候,无需dwarf调试信息,-s的意思剔除符号表。如果go build时刻加入了-ldflag “-w”,那么go编译出来的文件就无法用gdb调试。所以需要在docker-engine源码中有如下操作:

step1、docker-engine/Makefile里添加DOCKER_ENVS 添加-e DOCKER_DEBUG

step2、在docker-engine/hack/make.sh里检查有如下行:

if [ -z DOCER_DEBUG ]; then

LDFLAG="-w"

fi

2)在gdb attach到golang进程时刻,gdb都会提示要求加载runtime.py运行如下命令后,可以进行gdb golang调试了:

Source /usr/lib/golang/src/runtime/runtime-gdb.py

3)gdb可以对进程组进行调试,但是它默认不会attach到子进程中,所以如果需要对子进程进行调试可以通过如下方式:

set follow-fork-mode child //开启子进程调试

set detach-on-fork off //开启子进程调试时刻,也可以切换到主进程中

info inferiors可以看到当前的进程组中进程的情况,通过inferior id号可以像切换线程一样切换到进程组中进程。

4、dlv工具调试docker

dlv是当前比较好用的golang调试工具,相比较gdb,它可以看到goroutine,这就是巨大的优势。但是较gdb它却不能进行子进程调试,所以两个调试工具结合起来最好。

5、修改docker的配置文件daemon.json后重新加载docker

kill -SIGHUP $(pidof dockerd)

相关文章

网友评论

      本文标题:Docker调试手段

      本文链接:https://www.haomeiwen.com/subject/dihnnftx.html