我以 root 身份登录,但
strace
出现以下信息:root@kyznecov-System:/home/kyznecov# ps -e | grep 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-系统:/home/kyznecov root @ kyznecov-System:/ home / kyznecov#cat / proc / sys / kernel / yama / ptrace_scope 0
然后,我尝试使用
gdb
分叉在 Eclipse CDT 中调试多进程程序,它给了我相同的结果/错误:
有任何想法吗?
答案1
出现错误的一个原因:
attach: ptrace(PTRACE_ATTACH, ...): Operation not permitted
是因为该进程已经通过 或类似方式附加到gdb
。strace
要检查是否是这种情况,请运行:
grep TracerPid /proc/$THE_PID/status
如果它非零,那就是已经在该进程上运行跟踪的现有程序的 pid。
答案2
作为韋萊评论说,这种情况应该只能由于内核错误而发生。所以目前能够提出这个问题的任何人(包括特别是这个问题的原始发帖人)都应该报告错误仔细阅读该页面,然后ubuntu-bug linux
在受影响的机器上运行. 应在 Ubuntu 中报告此问题linux
,并且不是针对主线(上游)内核,除非您可以在主线内核上生成它(您必须加载yama
)。
从 Ubuntu 10.10 开始,每个 Ubuntu 版本的预期行为都是进程 A 无法跟踪正在运行的进程 B,除非 B 是 A 的直接子进程(或 A 以 的身份运行root
)。这是一项安全增强功能,使得被攻击者入侵的进程无法使用内核提供的调试工具来发现来自其他进程的信息。这在ptrace 范围安全功能社区维基页面的部分。
此限制行为是默认行为,但可以进行更改,以允许进程 A 跟踪使用与进程 A 相同的用户 ID 运行的任何正在运行的进程 B。也就是说,您可以将系统配置为允许任何进程相互调试。这简化了将调试器附加到已运行进程的过程。
此设置的显示位置为/proc/sys/kernel/yama/ptrace_scope
系统控制.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
起初,我以为我能够重现忽略 并将 视为 的ptrace_scope
问题。但我不再相信这是事实,因为我再次做了所有相同的事情,但无法重现该问题。我已在以下设备上进行了测试:0
1
- 我每天使用的 Lubuntu Precise amd64 物理机作为我的主机。
- 运行 Lubuntu Precise i386 (12.04) 实时 CD 的 VirtualBox 虚拟机。
- 一个相同的 VirtualBox 虚拟机运行 Quantal i386(Ubuntu+1)日常(20120608)。
在这三台机器上,预期的行为都发生了,我无法重现这个问题的原始发帖人所询问的情况。以下是来自终端的一些文本(来自 Precise 实时系统):
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
产生只有少数结果,其中显然没有关于此错误的报告报告该错误将有助于其他人,可能会导致解决方法或修复,并且可能是继续解决该问题的唯一有意义的方法(假设问题仍然存在)。