2014-01-28 45 views
6

我在docker容器中有一个长期运行的进程,我想附加gdb来查看哪些线程正在运行并获取堆栈跟踪。我可以附加到主机的进程,但我无法解析任何符号,因为可执行文件位于文件系统中的不同位置(它位于docker-mounted卷中),共享系统库全部卡在docker文件系统映像中/ var/lib/docker中的某处。我怎样才能gdb连接到在码头集装箱运行的进程?

我能够生成一个核心文件,并使用gdb通过指定主机的可执行文件的路径来查看它,但是因为系统库全部位于错误的位置并且被加载到核心文件中的错误位置,我从中得不到任何信息。

我有任何我忽略的选项吗?

+0

您可能可以将gdb安装到映像中,然后使用docker run -volumes-from''从共享该docker-mounted卷的另一个容器中挂载文件。 – Andy

回答

11

您可以通过lxc-attach通过附加到正在运行的容器来附加到在容器中运行的gdb实例。

注意: gdb必须已经安装在该容器中,或者您必须安装它。

# find your container ID 
sudo docker ps 
# list of your containers - container ID is 1234567890 
# find your full container ID 
sudo docker ps --no-trunc -q| grep <short ID> 
sudo lxc-attach -n <container long ID> 

[email protected]:/# 
# optionally, you can install gdb now if it is not installed 
# yum install gdb 

[email protected]:/# gdb 
... 
(gdb) attach 1 

UPDATE 2017-04:

有使用泊坞窗Exec现在可用的(感谢@ 42n4)一个更简单的工作流程。

# find your container ID 
sudo docker ps 
# list of your containers - container ID is 1234567890 
docker exec -i -t 1234567890 /bin/bash 

[email protected]:/# 
# optionally, you can install gdb now if it is not installed 
# yum install gdb 

[email protected]:/# gdb 
... 
(gdb) attach 1 
+1

最后的码头使用“ID”而不是“ID”。 sudo码头检查1234567890 | grep'“Id”'| sed's/[^ 0-9a-z] // g' –

+1

这给出了所有长ID:docker ps --no-trunc | awk'{print $ 1}';但lxc-attach现在不起作用,也许码头执行程序 - 'short id'/ bin/bash? – 42n4

+0

@ 42n4 docker ps --no-trunc -q | grep 也是可能的 – Jiri