centos下用gdb调试docker

前端之家收集整理的这篇文章主要介绍了centos下用gdb调试docker前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

运行环境:

centos:CentOS Linux release 7.2.1511 (Core)

docker 版本:Docker version 1.8.2-el7.centos,build a01dc02/1.8.2


在工作环境下一般不能访问外网,只能在rpm网站下载rpm然后进行安装,我的环境只要下载

docker rpm安装包:http://rpm.pbone.net/index.PHP3/stat/4/idpl/31976588/dir/centos_7/com/docker-1.8.2-10.el7.centos.x86_64.rpm.html

docker-selinux 安装包:http://rpm.pbone.net/index.PHP3/stat/4/idpl/31976599/dir/centos_7/com/docker-selinux-1.8.2-10.el7.centos.x86_64.rpm.html

docker 源码rpm包:http://rpm.pbone.net/index.PHP3/stat/3/srodzaj/2/search/docker-1.8.2-10.el7.centos.src.rpm

下载rpm下来之后,用同样的方式,你需要下载golang安装包进行安装拷贝到工作环境,yum install *.rpm 就可以安装docker了,由于cenots环境不同,你可能还需要其他的依赖包,你可以在docker rpm安装包中查找依赖包下载下来进行安装。

你还需要gdb -v,看一下你当前的gdb版本,目前支持调试Go程序的GDB版本必须大于7.1

务必保证执行如下操作(保证info goroutines可用)

vim ~/.gdbinit 添加下面一行:

add-auto-load-safe-path $GOROOT/src/pkg/runtime/runtime-gdb.py

把$GOROOT替换为你自己的路径

我的go版本为1.4.2,我的runtime-gdb.py路径为:/usr/lib/golang/src/runtime/runtime-gdb.py

如果在~/.gdbinit 中加入了路径依然执行info goroutines不可用,可以在gdb /usr/bin/docker 之后,执行 source/usr/lib/golang/src/runtime/runtime-gdb.py,这样就可以了。

如果执行source/usr/lib/golang/src/runtime/runtime-gdb.py 出现错误,如下:

(gdb) source /usr/lib/golang/src/runtime/runtime-gdb.py
Loading Go Runtime support.
Traceback (most recent call last):
  File "/go/src/runtime/runtime-gdb.py",line 205,in <module>
    _rctp_type = gdb.lookup_type("struct runtime.rtype").pointer()
gdb.error: No struct type named runtime.rtype.

则可以对/usr/lib/golang/src/runtime/runtime-gdb.py文件做如下修改

205 _rctp_type = gdb.lookup_type("struct runtime.rtype").pointer()
206
207
208 def iface_commontype(obj):
209 if is_iface(obj):
210 go_type_ptr = obj['tab']['_type']
211 elif is_eface(obj):
212 go_type_ptr = obj['_type']
213 else:
214 return
215
216 return go_type_ptr.cast(_rctp_type).dereference()

to:
205 #_rctp_type = gdb.lookup_type("struct runtime.rtype").pointer()
206
207
208 def iface_commontype(obj):
209 if is_iface(obj):
210 go_type_ptr = obj['tab']['_type']
211 elif is_eface(obj):
212 go_type_ptr = obj['_type']
213 else:
214 return
215
216 # return go_type_ptr.cast(_rctp_type).dereference()
217 return go_type_ptr.cast(gdb.lookup_type("struct runtime.rtype").pointer()).dereference(

修改之后,执行source /usr/lib/golang/src/runtime/runtime-gdb.py,就不会报错了。

如果这样还是不能解决问题,可以下载高版本golang,然后替换这个文件就可以了。我用的golang版本为1.4.2,我直接替换了1.5.4的就可以把问题解决了。

好,环境已经搭建好了,开始我们gdb调试docker之旅。

Sangfor:aCloud/node-631 /sf # gdb /usr/bin/docker
(gdb) start -d -D --selinux-enabled


会看到如下信息:

Temporary breakpoint 1,main.main () at /builddir/build/BUILD/docker-a01dc02d9c369141f8bbbea0f51e8759dd6e5b93/docker/docker.go:18

18 /builddir/build/BUILD/docker-a01dc02d9c369141f8bbbea0f51e8759dd6e5b93/docker/docker.go: No such file or directory.

解决办法:

rpm -hiv docker-1.8.2-10.el7.centos.src.rpm,解压出源代码,解压到的目录为/root/rpmbuild/SOURCES

cd/root/rpmbuild/SOURCES;

mkdir -p /builddir/build/BUILD/

tar -zxvfa01dc02d9c369141f8bbbea0f51e8759dd6e5b93.tar.gz -C/builddir/build/BUILD/



这样就可以看到代码,一步一步调试docker了。

猜你在找的CentOS相关文章