当前位置: 首页>>技术问答>>正文


升级后gdb不会附加到进程

, , , ,

问题描述

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/1281.html,未经允许,请勿转载。