我如何gdb附加到在docker容器中运行的进程?

时间:2014-01-28 01:18:59

标签: gdb docker

我在docker容器中有一个长时间运行的进程,我想附加gdb来查看正在运行的线程并获取stacktraces。我可以从主机附加到进程,但是我无法解析任何符号,因为可执行文件位于文件系统中的不同位置(它位于装载器的卷中)并且共享系统库全部停留在docker文件系统映像中在/ var / lib / docker中的某个地方。

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

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

1 个答案:

答案 0 :(得分:14)

您可以通过 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>

root@1234567890:/#
# optionally, you can install gdb now if it is not installed
# yum install gdb

root@1234567890:/# gdb
...
(gdb) attach 1

UPDATE 2017-04:

现在可以使用docker exec更简单的工作流程(感谢@ 42n4)。

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

root@1234567890:/#
# optionally, you can install gdb now if it is not installed
# yum install gdb

root@1234567890:/# gdb
...
(gdb) attach 1