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

如何将gdb附加到docker容器中运行的进程?,gdb,docker,Gdb,Docker,我在docker容器中有一个长时间运行的进程,我希望将gdb附加到该进程,以查看正在运行的线程并获取堆栈跟踪。我可以从主机附加到进程,但我无法解析任何符号,因为可执行文件位于文件系统中的不同位置(它位于docker装入的卷中),并且共享系统库都卡在/var/lib/docker中某个位置的docker文件系统映像中 我能够生成一个核心文件,并通过指定主机到可执行文件的路径来使用gdb查看它,但由于系统库都位于错误的位置,并且加载到了核心文件中的错误位置,因此我无法从中获得任何信息 我是否有忽略的

我在docker容器中有一个长时间运行的进程,我希望将gdb附加到该进程,以查看正在运行的线程并获取堆栈跟踪。我可以从主机附加到进程,但我无法解析任何符号,因为可执行文件位于文件系统中的不同位置(它位于docker装入的卷中),并且共享系统库都卡在/var/lib/docker中某个位置的docker文件系统映像中

我能够生成一个核心文件,并通过指定主机到可执行文件的路径来使用gdb查看它,但由于系统库都位于错误的位置,并且加载到了核心文件中的错误位置,因此我无法从中获得任何信息


我是否有忽略的选项?

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

如果您共享了docker装入的卷,则可以将gdb安装到映像中,然后使用
docker run--volumes from
从另一个容器装入文件。最后一个docker使用“Id”而不是“Id”。sudo docker inspect 1234567890 | grep'Id'| sed's/[^0-9a-z]//g'这给出了所有长Id:docker ps——没有trunc | awk'{print$1};但是lxc连接现在不起作用,可能是docker exec-it'short id'/bin/bash?@42n4 docker ps-不可能是trunc-q | grep
# 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