微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

gdbserver不会附加到Docker容器中正在运行的进程上

如何解决gdbserver不会附加到Docker容器中正在运行的进程上

在我的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都拒绝附加正在运行的进程:

  1. $ kubectl exec -it POD_NAME-容器调试器-gdbserver --attach:44444 59
    无法附加到lwp 59:没有这样的文件或目录(2)
    退出
  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之间准备正确的握手时,我需要在哪里/需要检查什么?

解决方法

gdbserver无法附加到正在运行的C ++进程的基本原因是由于 Ubuntu中的安全性增强(版本> = 10.10):
默认情况下,进程A不能跟踪正在运行的进程B,除非B是A的直接子级 (或A以root身份运行)。
仍然始终允许直接调试,例如gdb EXEstrace EXE

可以通过将/proc/sys/kernel/yama/ptrace_scope的值从1(=默认)更改为0(=所有进程允许的跟踪)来放宽限制。可以通过以下方式更改安全设置:
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

ptrace范围描述的所有功劳都属于以下帖子, 请参阅Eliah Kagan的第二个答案-感谢您的详尽解释! -在这里:
https://askubuntu.com/questions/143561/why-wont-strace-gdb-attach-to-a-process-even-though-im-root

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。