问题描述
我刚刚从10.04升级到11.04并且gdb不允许我再附加到进程我得到错误
Attaching to process 10144 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 ptrace: Operation not permitted.
我如何解决这个问题,以便我可以在没有sudo的情况下再次调试?
最佳解决方案
在Maverick Meerkat(10.10)中,Ubuntu推出了一个补丁,禁止non-root用户对non-child进程进行处理 – 即。只有作为另一个进程的父进程的进程才能为普通用户进行处理 – 而root仍然可以对每个进程进行处理。因此,为什么你可以使用gdb仍然通过sudo附加。
您可以通过执行以下操作暂时禁用此限制(并恢复为允许用户ptrace(gdb)其他任何进程的旧行为):
echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
要永久允许它编辑/etc/sysctl.d/10-ptrace.conf并更改该行:
kernel.yama.ptrace_scope = 1
阅读
kernel.yama.ptrace_scope = 0
有关进行此更改的原因,请参阅Ubuntu wiki
次佳解决方案
如果您希望将/proc/sys/kernel/yama/ptrace_scope
设置为其默认值1
,则作为解决方法,您可以考虑使用gdb
来运行要调试的程序。然后,只需按^C
即可调出调试器。例如,要调试(无聊)程序sleep 60
,请执行以下操作:
$ gdb -q sleep -ex 'run 60'
这是一个完整的例子。
$ gdb -q sleep -ex 'run 60'
Reading symbols from sleep...(no debugging symbols found)...done.
Starting program: /bin/sleep 60
^C
Program received signal SIGINT, Interrupt.
0x00007ffff7ad5d60 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
81 ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) backtrace
#0 0x00007ffff7ad5d60 in __nanosleep_nocancel () at ../sysdeps/unix/syscall-template.S:81
#1 0x0000000000403cd7 in ?? ()
#2 0x0000000000403b88 in ?? ()
#3 0x00000000004016c9 in ?? ()
#4 0x00007ffff7a35ec5 in __libc_start_main (main=0x401540, argc=2, argv=0x7fffffffea08, init=<optimized out>,
fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe9f8) at libc-start.c:287
#5 0x00000000004017d5 in ?? ()
(gdb) continue
Continuing.
[Inferior 1 (process 3531) exited normally]
(gdb) quit
由于/bin/sleep
(毫不奇怪)编译时没有调试信息,因此上述回溯包含最少的信息。