升级后,gdb 无法附加到进程

升级后,gdb 无法附加到进程

我最近刚刚从 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(毫不奇怪)编译时没有调试信息,上面的回溯包含的信息很少。

相关内容