【问题标题】:gdbserver does not attach to a running process in a docker containergdbserver 不附加到 docker 容器中正在运行的进程
【发布时间】: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 都拒绝附加正在运行的进程:

  1. $ kubectl exec -it POD_NAME --container debugger -- 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 之间的正确握手?

【问题讨论】:

    标签: docker gdbserver


    【解决方案1】:

    gdbserver 无法附加到正在运行的 C++ 进程的基本原因是由于 Ubuntu 中的安全增强功能(版本 >= 10.10):
    默认情况下,除非 B 是 A 的直接子进程,否则进程 A 无法跟踪正在运行的进程 B (或 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多