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


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

    root @ kyznecov系统:/ home / kyznecov#ps -e | grep 111
     3807点/ 2 00:00:00 111
     3810点/ 2 00:00:00 111
    root @ kyznecov系统:/ 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系统:/ home / kyznecov
    
    root @ kyznecov系统:/ home / kyznecov#cat / proc / sys / kernel / yama / ptrace_scope
    0
  • 然后,我尝试使用gdb叉子在Eclipse CDT中调试多进程程序,它给了我相同的结果/错误:

    在此处输入图片说明

有任何想法吗?


由于ptrace_scope为零,这无关紧要,但是就像一个实验一样,您可以尝试更简单地使用strace,在该过程中,跟踪进程是被跟踪进程的父级。例如strace /bin/echo test?是否给出相同的错误信息?
Jordan Uggla 2012年

@EliahKagan,理论上,OP所描述的内容在没有内核错误的情况下不会发生。如果您在接下来的24小时左右有空,并且可以将您的评论转化为答案,那将是很棒的-我对Precise进行的测试没有发现任何问题,因此这将是一个肯定的答案,即有些古怪在OP的配置中...自5月29日提出他的第一个问题以来,他一直没有回来
。– ish

@EliahKagan,有一件事重读了“不允许的操作”,这让我感到震惊-因为我在无数次扎根于OpenVZ VPS / VM之前就已经看过它了(它们共享主机内核,所以没有,您只是您自己小岛上的国王)...也许是这种情况吗?看到这贴
ish 2012年

@izx您的粘贴已过期。而且我有这个问题(在容器内),任何见解都很好
Kunal Tyagi

Answers:


25

出现错误的原因之一:

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

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

grep TracerPid /proc/$THE_PID/status

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


如果我们正在Eclipse中进行调试,我们不会注意到这一点……它已经在使用GDB了
ernesto 2014年

感谢您指出了这一点。我正在通过strace包装器运行程序。程序会分叉,然后执行。被执行的子进程在运行strace包装器时很快死亡,该包装器由于父进程已经在strace的控制之下而无法附加。
罗伯·肯尼迪

18

正如izx所说,这只能由于内核错误才能发生。因此,建议任何当前能够产生此问题的人(尤其是该问题的原始发帖人)建议通过彻底仔细地阅读该页面,然后在受影响的计算机上运行,将其报告为错误ubuntu-bug linux。这应该linux在Ubuntu中进行报告,而不是在主线(上游)内核中进行报告,除非可以在主线内核中生成它(必须已yama加载)。

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

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

设置由/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,而且当straceroot。几乎看不到这是一个错误,而是很难-我强烈建议将其报告为一个。

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

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

在所有三台计算机上,都会发生预期的行为,并且我无法重现此问题的原始发布者所询问的条件。这是终端机(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只会产生少量结果,显然没有关于该错误的报告。报告该错误将对其他人有所帮助,可能会导致变通办法或修复,并且可能是继续解决此问题的唯一有意义的方法(假定问题仍然存在)。


感谢您的建议,我明天将详细阅读它,也许还会添加一些子标题,但是我认为这非常彻底:)
ish 2012年

在我的帖子中,您可以看到:root @ kyznecov-System:/ home / kyznecov#cat / proc / sys / kernel / yama / ptrace_scope 0我做到了:echo 0 | sudo tee / proc / sys / kernel / yama / ptrace_scope
andreykyz 2012年

轻松地完成所有工作。但是,如果我在eclipse中运行程序并尝试从控制台执行strace,则会出现问题。
andreykyz 2012年

2
可能已经跟踪了过程的副作用?当在父进程上使用gdb与allow-fork-mode子进程时,我遇到了同样的问题
Jamie Pate 2013年

2
我在14.04上也遇到了这个错误。有人知道是否曾报告过错误吗?
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.