当我跑步时
strace -f strace /bin/ls
通过
知道失败是如何失败的ptrace(PTRACE_TRACEME, 0, 0, 0) = -1 EPERM (Operation not permitted)
即使使用root帐户。
这有什么解决方案吗?
答案 0 :(得分:9)
答案 1 :(得分:2)
我在最近的blog post about strace中提到了这个以及更多有用的提示。
您需要启用对gdb,strace和类似工具的支持,以附加到系统上的进程。
您可以通过运行命令来设置设置proc:
来暂时执行此操作 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
。
答案 2 :(得分:0)
ptrace系统调用仅限于每个进程一个跟踪应用程序。
man 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跟踪ls时从第二个strace跟踪第一个线程。
strace strace -f ls
进行特定的系统调用时,有-b可以与lwp分离,但是仅支持execve。如果有ptrace呼叫支持,那将是完美的。这意味着strace要么需要一个小补丁来支持ptrace调用。
潜在的黑客手段包括预加载的库,该库实现了一些技巧性的分离。
更好的选择是使用跟踪工具systemtap或trace-cmd,它们可以使用内核提供的跟踪基础结构代替ptrace。