【发布时间】:2016-03-28 13:07:18
【问题描述】:
当我跑步时
strace -f strace /bin/ls
要知道 strace 是如何工作失败的
ptrace(PTRACE_TRACEME, 0, 0, 0) = -1 EPERM (Operation not permitted)
即使是 root 帐户。
有什么解决办法吗?
【问题讨论】:
标签: permissions strace
当我跑步时
strace -f strace /bin/ls
要知道 strace 是如何工作失败的
ptrace(PTRACE_TRACEME, 0, 0, 0) = -1 EPERM (Operation not permitted)
即使是 root 帐户。
有什么解决办法吗?
【问题讨论】:
标签: permissions strace
在 Docker 容器中运行 strace 时,要启用 ptrace,请使用 SYS_PTRACE 参数运行:
docker run -it --cap-add SYS_PTRACE ubuntu
【讨论】:
我在最近的 blog post about strace 中提到了这一点以及更多有用的提示。
您需要启用对 gdb、strace 和类似工具的支持才能附加到系统上的进程。
您可以通过运行命令来设置设置过程来临时执行此操作:
sudo bash -c 'echo 0 > /proc/sys/kernel/yama/ptrace_scope'
您可以通过修改/etc/sysctl.d/10-ptrace.conf 和设置kernel.yama.ptrace_scope = 0 在系统重新启动之间保持该设置。
如果你的系统没有/etc/sysctl.d/10-ptrace.conf,可以修改/etc/sysctl.conf,设置kernel.yama.ptrace_scope = 0。
【讨论】:
cat /proc/sys/kernel/yama/ptrace_scope 0. pid 13953] ptrace(PTRACE_TRACEME, 0, 0, 0) = -1 EPERM (Operation not allowed) 之后出现同样的错误
cat /proc/sys/kernel/yama/ptrace_scope 产生 0,但我得到了错误。问题可能是由于进程在 docker 容器内运行的事实。有这方面的经验吗?
ptrace 系统调用仅限于每个进程一个跟踪应用程序。
人 ptrace:
EPERM The specified process cannot be traced. This could be because the tracer has insuffi‐ cient privileges (the required capability is CAP_SYS_PTRACE); unprivileged processes cannot trace processes that they cannot send signals to or those running set-user- ID/set-group-ID programs, for obvious reasons. Alternatively, the process may already be being traced, or (on kernels before 2.6.26) be init(1) (PID 1).
这意味着只有调试应用程序可以附加到同一进程。当你完成 strace -f 你告诉它附加由程序调试启动的所有进程。在您的情况下, strace 调用 fork 以创建一个新进程并设置新进程以使用 ptrace 系统调用进行调试。然后它使用您提供给调用的参数调用 exec。然后再次启动 strace 尝试再次执行 fork 和 ptrace。但是第二个 ptrace 因 EPERM 失败,因为第一个 strace 已经附加到进程。
运行不带 -f 参数的第一个 strace 允许您从第二个 strace 跟踪第一个线程,而第二个 strace 正在跟踪 ls。
strace strace -f ls
当进行特定的系统调用时,有 -b 可以从 lwp 分离,但它只支持 execve。如果有 ptrace 调用支持,那就完美了。这意味着 strace 要么需要一个小补丁来支持 ptrace 调用。
替代的潜在黑客包括预加载库,该库通过一些技巧实现分离。
更好的选择是使用跟踪工具 systemtap 或 trace-cmd,它们可以使用内核提供的跟踪基础设施而不是 ptrace。
【讨论】: