即使我是 root,为什么 strace/gdb 也不会附加到进程?

and*_*kyz 28 programming kernel 11.10 debugging 12.04

  • 我以 root 身份登录,但strace给了我这个:

    root@kyznecov-System:/home/kyznecov# ps -e | 111
     3807 分/2 00:00:00 111
     3810 分/2 00:00:00 111
    root@kyznecov-System:/home/kyznecov# strace -p 3810
    
    附加:ptrace(PTRACE_ATTACH,...):不允许操作
    无法附加到进程。如果您的 uid 与目标的 uid 匹配
    进程,检查/proc/sys/kernel/yama/ptrace_scope的设置,或者尝试
    再次以 root 用户身份。有关更多详细信息,请参阅 /etc/sysctl.d/10-ptrace.conf
    root@kyznecov-System:/home/kyznecov
    
    root@kyznecov-System:/home/kyznecov# cat /proc/sys/kernel/yama/ptrace_scope
    0
  • 然后我尝试使用gdb分叉在 Eclipse CDT 中调试多进程程序,它给了我相同的结果/错误:

    在此处输入图片说明

有任何想法吗?

Nat*_*idd 26

出现错误的原因之一:

attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted

是因为过程已经重视与gdbstrace或类似的。要检查是否是这种情况,请运行:

grep TracerPid /proc/$THE_PID/status

如果它不为零,则它是已经在该进程上运行跟踪的现有程序的 pid。


Eli*_*gan 20

正如izx所评论的,这应该只能由于内核错误而发生。因此,任何目前可以产生此问题的人——尤其是这个问题的原始海报——都最好通过彻底仔细阅读该页面,然后在受影响的机器上运行,将其报告为错误ubuntu-bug linux。这应该linux在 Ubuntu 中报告,而不是针对主线(上游)内核,除非您可以在主线内核上生成它(您必须已yama加载)。

从 Ubuntu 10.10 开始,每个版本的 Ubuntu 中的预期行为是进程 A 无法跟踪正在运行的进程 B,除非 B 是 A 的直接子进程(或 A 运行为root)。这是一种安全增强,它使得被攻击者破坏的进程无法使用内核提供的调试工具来发现来自其他进程的信息。这在安全功能社区 wiki 页面ptrace 范围部分进行了解释。

此限制行为是默认行为,但可以更改以允许进程 A 跟踪使用与进程 A 自己的用户 ID 相同的用户 ID 运行的任何正在运行的进程 B。也就是说,您可以配置您的系统以允许您的任何进程相互调试。这简化了将调试器附加到已经运行的进程的过程。

此设置由/proc/sys/kernel/yama/ptrace_scope sysctl公开。1表示限制性更强的行为和0限制性更少的行为。可以通过以下方式读取设置:

cat /proc/sys/kernel/yama/ptrace_scope
Run Code Online (Sandbox Code Playgroud)

可以通过以下方式设置限制较少(非默认)的行为:

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Run Code Online (Sandbox Code Playgroud)

并且可以通过以下方式设置(或设置回)更严格的(默认)行为:

echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scope
Run Code Online (Sandbox Code Playgroud)

这个问题的原始发布者不仅无法将strace实例附加到当前运行的进程中,ptrace-scope设置为0,而且原始发布者在straceroot. 很难看出这可能只是一个错误——我强烈建议将其报告为一个错误。

起初,我以为我能够重现忽略ptrace_scope设置的问题0并将其视为1. 但是我不再相信是这种情况,因为我再次做了所有相同的事情,并且无法重现该问题。我已经对此进行了测试:

  • 我每天使用的 Lubuntu Precise amd64 物理机作为我的主要机器。
  • 运行 Lubuntu Precise i386 (12.04) live CD 的 VirtualBox 虚拟机。
  • 运行 Quantal i386 (Ubuntu+1) daily-live (20120608) 的相同 VirtualBox 虚拟机。

在所有三台机器上,都发生了预期的行为,我无法重现此问题的原始发布者所询问的条件。这是来自终端的一些文本(来自精确实时系统):

lubuntu@lubuntu:~$ nano&
[1] 3492
lubuntu@lubuntu:~$ strace -p 3492
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
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

[1]+  Stopped                 nano
lubuntu@lubuntu:~$ cat /proc/sys/kernel/yama/ptrace_scope
1
lubuntu@lubuntu:~$ echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
0
lubuntu@lubuntu:~$ strace -p 3492
Process 3492 attached - interrupt to quit
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
ioctl(1, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = ? ERESTARTSYS (To be restarted)
--- SIGTTOU (Stopped (tty output)) @ 0 (0) ---
Run Code Online (Sandbox Code Playgroud)

strace 正如预期的那样,继续生成消息,直到我暂停它。

最后,我再次建议将此报告为错误。上的一个最大包容性的搜索https://bugs.launchpad.net(包括任何有关报道Ubuntu的错误)的文本ptrace_scope产生只是一个结果的屈指可数,其中显然没有对于此错误报告。报告错误会帮助其他人,可能会导致解决方法或修复,并且可能是继续处理此问题的唯一有意义的方法(假设问题仍在发生)。

  • 可能是已经被追踪的过程的副作用?在具有允许叉模式子进程的父进程上使用 gdb 时,我遇到了同样的问题 (2认同)
  • 我在 14.04 也遇到了这个错误。有谁知道是否曾为此报告过错误? (2认同)