【发布时间】:2020-11-09 12:14:46
【问题描述】:
在我的 docker 容器(基于 SUSE 发行版 SLES 15)中,安装了 C++ 可执行文件(带有调试增强代码)和 gdbserver 可执行文件。
在执行任何有效的操作之前,C++ 可执行文件会休眠 5 秒,然后初始化并处理来自数据库的数据。处理时间足够长,可以将其附加到 gdbserver。
C++ 可执行文件在后台启动,并将其进程 ID 返回到控制台。
之后立即启动 gdbserver 并附加到相同的进程 ID。
问题:gdbserver 报错无法连接进程:
无法附加到 lwp 59:没有这样的文件或目录 (2)
退出
在另一次尝试中,我已将相同的 gdbserver 可执行文件复制到 docker 容器中的 /tmp。
启动这个 gdbserver 给出了不同的错误响应:
无法附加到进程 220:不允许操作 (1)
退出
已验证,在这两种情况下,进程仍在运行。 'ps -e' 清楚地显示进程 ID 和进程名称。
如果该过程已经完成,则会抛出不同的错误消息;这很清楚,不需要解释:
gdbserver: 无法打开 /proc 文件 '/proc/79/status'
gdbserver 从容器外部启动一次,从内部启动一次。
在这两种情况下,gdbserver 都拒绝附加正在运行的进程:
- $ kubectl exec -it POD_NAME --container debugger -- gdbserver --attach :44444 59
无法附加到 lwp 59:没有这样的文件或目录 (2)
退出 - $ kubectl exec -it POD_NAME -- /bin/bash
bash-4.4$ cd /tmp
bash-4.4$ ./gdbserver 10.0.2.15:44444 --attach 220
无法附加到进程 220:不允许操作 (1)
退出
谁能解释一下导致gdbserver拒绝附加到指定进程的原因 并给出如何克服不匹配的建议,即我需要检查哪里/什么来准备 C++ 可执行文件和 gdbserver 之间的正确握手?
【问题讨论】: