升级后gdb不会附加到进程

我刚刚从10.04升级到11.04并且gdb不允许我再附加到进程我得到错误

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

我如何解决这个问题,以便我可以在没有sudo的情况下再次调试?

在Maverick Meerkat(10.10)中,Ubuntu引入了一个补丁,禁止非root用户使用非子进程 – 即。 只有作为另一个进程的父进程的进程才能为普通用户进行处理 – 而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=, fini=, rtld_fini=, stack_end=0x7fffffffe9f8) at libc-start.c:287 #5 0x00000000004017d5 in ?? () (gdb) continue Continuing. [Inferior 1 (process 3531) exited normally] (gdb) quit 

由于/bin/sleep是(不出所料)编译时没有调试信息,因此上述回溯包含最少的信息。