我最近刚刚从 10.04 升级到 11.04,gdb 不再允许我附加到进程,我收到错误
附加到进程 10144 无法附加到进程。如果您的 uid 与目标进程的 uid 匹配,请检查 /proc/sys/kernel/yama/ptrace_scope 的设置,或以 root 用户身份重试。有关更多详细信息,请参阅 /etc/sysctl.d/10-ptrace.conf ptrace:操作不允许。
我该如何修复此问题以便可以在没有 sudo 的情况下再次调试?
答案1
在 Maverick Meerkat (10.10) 中,Ubuntu 引入了一个补丁,禁止非 root 用户对非子进程进行 ptrace - 即,只有作为另一个进程的父进程才能为普通用户对其进行 ptrace - 而 root 仍然可以对每个进程进行 ptrace。因此,您仍然可以使用 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 维基百科。
答案2
如果您希望保留/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
(毫不奇怪)编译时没有调试信息,上面的回溯包含的信息很少。