docker 容器中的 gdb 返回“ptrace:不允许操作”。

Posted

技术标签:

【中文标题】docker 容器中的 gdb 返回“ptrace:不允许操作”。【英文标题】:gdb in docker container returns "ptrace: Operation not permitted." 【发布时间】:2017-06-21 03:42:41 【问题描述】:

我在容器和主机上检查了/proc/sys/kernel/yama/ptrace_scope - 两者都报告值为零,但当附加到 pid 时,一个 gdb 报告

Reading symbols from /opt/my-web-proxy/bin/my-web-proxy...done.
Attaching to program: /opt/my-web-proxy/bin/my-web-proxy, process 1
ptrace: Operation not permitted.

我也尝试过使用特权标志附加到容器

docker exec --privileged -it mywebproxy_my-proxy_1 /bin/bash

主机操作系统是 Fedora 25,带有来自其 repos 的 docker,容器是官方的 centos6.8

【问题讨论】:

主机 dmesg 输出中没有任何内容?它可能被 SELinux 阻止,请查看:fedoraproject.org/wiki/Features/SELinuxDenyPtrace 看起来像github.com/docker/docker/issues/21051 【参考方案1】:

我找到了答案——容器需要以 strace 功能启动

将它添加到我的 docker-compose.yml 文件允许 GDB 工作

cap_add:
    - SYS_PTRACE

或者也可以在docker命令行上用--cap-add=SYS_PTRACE传递

【讨论】:

这在尝试使用 jmap 或 jvisualvm 为 java 程序进行堆转储并获得 sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 1: Operation not permitted 作为错误时也相关

以上是关于docker 容器中的 gdb 返回“ptrace:不允许操作”。的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器内使用gdb

Docker容器内使用gdb

Docker容器内使用gdb

如何在Docker内部使用gdb调试器

如何使用 Amazon Linux 2、单容器、无 Docker Compose 在 AWS Elastic Beanstalk 上获取 SYS_PTRACE

gdb调试原理及qemu中的gdbserver