我在 docker 容器中有一个长时间运行的进程,我想将 gdb 附加到该进程以查看正在运行的线程并获取堆栈跟踪。我可以从主机附加到进程,但无法解析任何符号,因为可执行文件位于文件系统中的不同位置(位于 docker 安装的卷中),并且共享系统库都卡在 docker 文件系统映像中/var/lib/docker 中的某处。
我能够生成一个核心文件并使用 gdb 通过指定可执行文件的主机路径来查看它,但是由于系统库都位于错误的位置并且加载到核心文件中的错误位置,所以我没有得到从中得到的信息。
我是否有任何我忽略的选择?
您可以使用以下方式附加到流程gdb
通过附加到正在运行的容器来在容器中运行实例lxc-附加.
Note: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
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)