gdbserver 没有附加到 docker 容器中的 运行 进程
gdbserver does not attach to a running process in a docker container
在我的 docker 容器(基于 SUSE 发行版 SLES 15)中安装了 C++ 可执行文件(带有调试增强代码)和 gdbserver 可执行文件。
在做任何有成效的事情之前,C++ 可执行文件会休眠 5 秒,然后初始化并处理来自数据库的数据。处理时间足够长,可以将其附加到 gdbserver。
C++ 可执行文件在后台启动,其进程 ID 返回到控制台。
紧接着 gdbserver 启动并附加到相同的进程 ID。
问题:gdbserver 抱怨无法连接到进程:
Cannot attach to lwp 59: No such file or directory (2)
Exiting
在另一次尝试中,我将相同的 gdbserver 可执行文件复制到 docker 容器中的 /tmp。
启动此 gdbserver 给出了不同的错误响应:
Cannot attach to process 220: Operation not permitted (1)
Exiting
经验证,在这两种情况下,过程仍然是运行。 'ps -e'清楚显示进程id和进程名
如果该过程已经完成,则会抛出一条不同的错误消息;这很清楚,不需要解释:
gdbserver: unable to open /proc file '/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 拒绝附加到指定的进程
并给出如何克服不匹配的建议,即 where/what 我是否需要检查以准备 C++ 可执行文件和 gdbserver 之间的正确握手?
gdbserver 无法附加到 运行 C++ 进程的基本原因是
Ubuntu(版本 >= 10.10)中的安全增强:
默认情况下,进程 A 无法跟踪 运行 进程 B,除非 B 是 A 的直接子进程
(或者 A 以 root 身份运行)。
仍然始终允许直接调试,例如gdb EXE
和 strace EXE
.
可以通过将 /proc/sys/kernel/yama/ptrace_scope
的值从 1(=默认值)更改为 0(=允许所有进程跟踪)来放宽限制。可以通过以下方式更改安全设置:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
ptrace 作用域描述的所有功劳属于以下post,
请参阅 Eliah Kagan 的第二个答案 - 感谢您的详尽解释! - 这里:
https://askubuntu.com/questions/143561/why-wont-strace-gdb-attach-to-a-process-even-though-im-root
在我的 docker 容器(基于 SUSE 发行版 SLES 15)中安装了 C++ 可执行文件(带有调试增强代码)和 gdbserver 可执行文件。
在做任何有成效的事情之前,C++ 可执行文件会休眠 5 秒,然后初始化并处理来自数据库的数据。处理时间足够长,可以将其附加到 gdbserver。
C++ 可执行文件在后台启动,其进程 ID 返回到控制台。
紧接着 gdbserver 启动并附加到相同的进程 ID。
问题:gdbserver 抱怨无法连接到进程:
Cannot attach to lwp 59: No such file or directory (2)
Exiting
在另一次尝试中,我将相同的 gdbserver 可执行文件复制到 docker 容器中的 /tmp。
启动此 gdbserver 给出了不同的错误响应:
Cannot attach to process 220: Operation not permitted (1)
Exiting
经验证,在这两种情况下,过程仍然是运行。 'ps -e'清楚显示进程id和进程名
如果该过程已经完成,则会抛出一条不同的错误消息;这很清楚,不需要解释:
gdbserver: unable to open /proc file '/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 拒绝附加到指定的进程 并给出如何克服不匹配的建议,即 where/what 我是否需要检查以准备 C++ 可执行文件和 gdbserver 之间的正确握手?
gdbserver 无法附加到 运行 C++ 进程的基本原因是
Ubuntu(版本 >= 10.10)中的安全增强:
默认情况下,进程 A 无法跟踪 运行 进程 B,除非 B 是 A 的直接子进程
(或者 A 以 root 身份运行)。
仍然始终允许直接调试,例如gdb EXE
和 strace EXE
.
可以通过将 /proc/sys/kernel/yama/ptrace_scope
的值从 1(=默认值)更改为 0(=允许所有进程跟踪)来放宽限制。可以通过以下方式更改安全设置:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
ptrace 作用域描述的所有功劳属于以下post,
请参阅 Eliah Kagan 的第二个答案 - 感谢您的详尽解释! - 这里:
https://askubuntu.com/questions/143561/why-wont-strace-gdb-attach-to-a-process-even-though-im-root