我在docker容器中有一个长时间运行的进程,我想附加gdb来查看正在运行的线程并获取stacktraces。我可以从主机附加到进程,但是我无法解析任何符号,因为可执行文件位于文件系统中的不同位置(它位于装载器的卷中)并且共享系统库全部停留在docker文件系统映像中在/ var / lib / docker中的某个地方。
我能够生成核心文件并使用gdb通过指定主机的可执行文件路径来查看它,但是因为系统库都位于错误的位置并且被加载到corefile中的错误位置,我从中得不到任何信息。
我有任何我忽略的选择吗?
答案 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