在尝试将GDB附加到进程时如何解决“ptrace操作不允许”?

我正在尝试使用gdb附加程序,但它返回给我:

附加到进程29139无法附加到进程。 如果您的uid与目标进程的uid匹配,请检查/ proc / sys / kernel / yama / ptrace_scope的设置,或以root用户身份再次尝试。 有关更多详细信息,请参阅/etc/sysctl.d/10-ptrace.conf ptrace:不允许操作。

edb-debugger返回“无法附加到进程,请检查权限,然后重试。”

strace返回“attach:ptrace(PTRACE_ATTACH,…):不允许操作”

我将“kernel.yama.ptrace_scope”1更改为0并将“/ proc / sys / kernel / yama / ptrace_scope”1更改为0并尝试使用以下方法设置“set environment LD_PRELOAD =。/ ptrace.so”:

#include  int ptrace(int i, int j, int k, int l) { printf(" ptrace(%i, %i, %i, %i), returning -1\n", i, j, k, l); return 0; } 

但它仍然返回相同的错误。 我怎么能把它附加到调试器?

如果您使用的是Docker,则可能需要以下选项:

 docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined 

这是由于Linux中的内核强化; 您可以通过echo 0 > /proc/sys/kernel/yama/ptrace_scope或在/etc/sysctl.d/10-ptrace.conf修改它来禁用此行为

另请参阅Fedora 22中的这篇文章 (包含文档链接)和关于Ubuntu和。的评论主题 。

没有真正解决上述用例,但我遇到了这个问题:

问题 :碰巧我用sudo开始我的程序,所以在启动gdb时它给了我ptrace: Operation not permitted

解决方案sudo gdb ...

也许有人用gdb附加了这个过程。

  • ps -ef | grep gdb

不能gdb连接相同的进程两次。

我想补充一点,我需要--security-opt apparmor=unconfined以及@wisbucky提到的选项。 这是在Ubuntu 18.04(Docker客户端和主机)上。 因此,在容器中启用gdb调试的完全调用是:

docker run --cap-add=SYS_PTRACE --security-opt seccomp=unconfined --security-opt apparmor=unconfined

我不知道你在用LD_PRELOAD或你的ptrace函数做什么。

为什么不尝试将gdb附加到一个非常简单的程序? 制作一个只需重复打印Hello或其他东西的程序,并使用gdb –pid [hello program PID]附加到它上面。

如果这不起作用那么你确实遇到了问题。

另一个问题是用户ID。 您正在跟踪的程序是否将自己设置为另一个UID? 如果是,则除非您使用相同的用户ID或是root用户,否则无法对其进行ptrace。

我遇到了同样的问题并尝试了很多解决方案,但最后,我找到了解决方案,但实际上我不知道问题是什么。 首先我修改了ptrace_conf值并以root身份登录到Ubuntu,但问题仍然存在。 但最奇怪的事情是gdb向我展示了一条消息:

Could not attach to process. If your uid matches the uid of the target process, check the setting of /proc/sys/kernel/yama/ptrace_scope, or try again as the root user.
For more details, see /etc/sysctl.d/10-ptrace.conf warning: process 3767 is already traced by process 3755 ptrace: Operation not permitted.

使用ps命令终端,未列出进程3755。

我在/ proc / $ pid中找到了进程3755,但我不明白它是什么!

最后,我删除了目标文件(foo.c),我尝试使用PTRACE_ATTACH系统调用将其附加到vid gdb和tracer c程序,在另一个文件夹中,我创建了另一个c程序并对其进行了编译。

问题解决了,我可以通过gdb或ptrace_attach系统调用连接到另一个进程。

(gdb) attach 4416

附加到过程4416

我向进程4416发送了很多信号。我用gdb和ptrace测试了它们,它们都运行正常。

我真的不知道问题是什么,但我认为这不是Ubuntu中的一个错误,因为很多网站都提到过它,例如https://askubuntu.com/questions/143561/why-wont-strace- GDB-连接到一个处理偶数虽然-IM-根