运行环境:
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(
如果这样还是不能解决问题,可以下载高版本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了。