当前位置: 首页>>技术教程>>正文


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

, , , ,

问题描述

  • 我以root用户身份登录,但strace给出了以下信息:root @ kyznecov-System:/home /kyznecov#ps -e | grep 111 3807 pts /2 00:00:00 111 3810 pts /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中通过分叉调试多进程程序,它给了我相同的结果/错误:

有任何想法吗?

最佳办法

出现错误的原因之一:

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

这是因为该进程已经使用gdbstrace或类似名称附加到该进程。要检查是否存在这种情况,请运行:

grep TracerPid /proc/$THE_PID/status

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

次佳办法

正如izx所评论的那样,这仅可能由于内核错误而发生。因此,只要能够认真仔细地阅读该页面,然后在受影响的计算机上运行ubuntu-bug linux,那么当前可以解决此问题的人(尤其是该问题的原始发布者)将是well-advised至report it as a bug。这应该针对Ubuntu中的linux进行报告,而不是针对主线(上游)内核进行报告,除非您可以在主线内核中进行生产(必须加载yama)。

从Ubuntu 10.10开始的每个版本的Ubuntu中的预期行为是,除非B是A的直接子代(或A以root的身份运行),否则进程A无法跟踪正在运行的进程B。这是一项安全性增强功能,可以使遭受攻击者破坏的进程无法使用内核提供的调试功能从其他进程中发现信息。安全功能社区Wiki页面的ptrace范围部分对此进行了说明。

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

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

cat /proc/sys/kernel/yama/ptrace_scope

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

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope

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

echo 1 | sudo tee /proc/sys/kernel/yama/ptrace_scope

这个问题的原始发布者不仅无法将strace实例附加到ptrace-scope设置为0的当前正在运行的进程,而且原始发布者在将strace作为root运行时仍然无法这样做。几乎看不到这是一个错误,而是很难-我强烈建议将其报告为一个。

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

  • 我每天使用Lubuntu Precise amd64物理机作为主机。

  • 运行Lubuntu Precise i386(12.04)实时CD的VirtualBox虚拟机。

  • 运行Quantal i386(Ubuntu + 1)daily-live(20120608)的相同VirtualBox虚拟机。

在所有三台计算机上,都会发生预期的行为,并且我无法重现此问题原始发布者所询问的条件。这是终端机(Precise live系统)中的一些文本:

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) ---

strace继续产生消息,直到我按预期将其挂起为止。

最后,我建议再次将其报告为错误。在https://bugs.launchpad.net(包括任何报告的Ubuntu错误)上最大程度地搜索文本ptrace_scope会生成just a handful of results, in which clearly none are reports for this bug。报告该错误将对其他人有所帮助,可能会导致变通办法或解决方案,并且可能是继续解决此问题的唯一有意义的方法(假设问题仍然存在)。

参考资料

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