我构建了一个 docker 镜像,其中安装了gcc
binutils 和gdb
调试器。
我会将该 docker 容器附加到在同一 Linux 主机上运行的容器gdb
内的进程。该容器使用自己的命名空间,因此在 docker 容器中运行会抱怨目标进程和调试器不在同一个命名空间中。lxc
lxc
PID
gdb
PID
[SR-PCE-251:~]$ docker run -it --pid host --rm --cap-add=SYS_PTRACE --security-opt seccomp=unconfined carlo/ubuntu
root@e7b2db23af34:/#
root@e7b2db23af34:/# id
uid=0(root) gid=0(root) groups=0(root)
root@e7b2db23af34:/#
root@e7b2db23af34:/# gdb -q attach 11365
attach: No such file or directory.
Attaching to process 11365
[New LWP 24283]
[New LWP 20025]
[New LWP 20024]
[New LWP 19992]
[New LWP 19991]
[New LWP 13974]
[New LWP 13970]
[New LWP 13969]
[New LWP 13968]
[New LWP 13967]
[New LWP 13962]
[New LWP 13958]
[New LWP 13957]
[New LWP 13954]
[New LWP 13952]
[New LWP 13944]
[New LWP 12078]
[New LWP 11822]
[New LWP 11543]
[New LWP 11515]
[New LWP 11489]
[New LWP 11483]
[New LWP 11482]
[New LWP 11477]
[New LWP 11476]
warning: "target:/proc/11365/exe": could not open as an executable file: Operation not permitted.
warning: `target:/proc/11365/exe': can't open to read symbols: Operation not permitted.
warning: Could not load vsyscall page because no executable was specified
warning: Target and debugger are in different PID namespaces; thread lists and other data are likely unreliable. Connect to gdbserver inside the container.
0x00007f0bf997ac73 in ?? ()
(gdb)
我怎样才能摆脱它?
你不能这样做;PID 命名空间的想法是,一个命名空间不能检查另一个命名空间的进程(只要它不是同一命名空间的分支)。
因此,除非您想说服 docker 不要取消共享该容器的主 PID 命名空间(
docker run --pid=host
,如果我没记错的话),否则您可能没有构建最有用的容器。这似乎有点自相矛盾,因为您接下来还想共享被检查容器的挂载命名空间,以便真正能够读取可执行文件和库。然后,您需要说服 gdb 在哪里查找这些路径……这最终意味着您的 GDB 容器基本上相当于一个带有弯曲脚本的目录PATH
,LD_LIBRARY_PATH
因此可以从该目录调用自定义 GDB,但在实践中使用起来更复杂。我建议你不要这样做,而是在目标容器中运行 gdbstub。然后,你可以从本地(无论是在容器中还是“全局”)GDB 将其作为远程监视器连接到该容器。