Permissions strace-f strace/bin/ls与PTRACE_TRACEME EPERM一起失败(不允许操作)

Permissions strace-f strace/bin/ls与PTRACE_TRACEME EPERM一起失败(不允许操作),permissions,strace,Permissions,Strace,当我跑的时候 strace -f strace /bin/ls 要知道strace是如何工作的,它失败了 ptrace(PTRACE_TRACEME, 0, 0, 0) = -1 EPERM (Operation not permitted) 即使是根帐户 有什么解决办法吗?我在最近的一篇文章中提到了这一点和更多有用的提示 您需要启用对gdb、strace和类似工具的支持,以连接到系统上的进程 您可以通过运行命令设置设置过程来临时执行此操作: sudobash-c'echo 0>/pro

当我跑的时候

strace -f strace /bin/ls 
要知道strace是如何工作的,它失败了

ptrace(PTRACE_TRACEME, 0, 0, 0) = -1 EPERM (Operation not permitted) 
即使是根帐户


有什么解决办法吗?

我在最近的一篇文章中提到了这一点和更多有用的提示

您需要启用对gdb、strace和类似工具的支持,以连接到系统上的进程

您可以通过运行命令设置设置过程来临时执行此操作:

sudobash-c'echo 0>/proc/sys/kernel/yama/ptrace\u scope'

通过修改
/etc/sysctl.d/10 ptrace.conf
和设置
kernel.yama.ptrace\u scope=0,可以在系统重新启动之间保持该设置

如果您的系统没有
/etc/sysctl.d/10 ptrace.conf
,您可以修改
/etc/sysctl.conf
并设置
kernel.yama.ptrace\u scope=0

Docker 在Docker容器内运行
strace
时,要启用,请使用
SYS_PTRACE
param运行:

docker run -it --cap-add SYS_PTRACE ubuntu

请参阅:。

ptrace系统调用仅限于每个进程一个跟踪应用程序

男子比赛:

这意味着只有调试应用程序可以附加到同一进程。当您完成strace-f时,您告诉它附加由调试的程序启动的所有进程。在您的情况下,strace调用fork创建一个新进程,并使用ptrace系统调用设置新进程以进行调试。然后,它使用您提供给调用的参数调用exec。然后再次启动strace,尝试再次执行fork和ptrace。但是第二个ptrace在EPERM中失败,因为第一个strace已经连接到该进程

在不带-f参数的情况下运行first strace允许您从第二个strace跟踪第一个线程,而第二个strace正在跟踪ls

strace strace -f ls
当进行特定的系统调用时,可以从lwp中分离-b,但它只支持execve。如果有ptrace呼叫支持,那将是完美的。这意味着strace或者需要一个小补丁来支持ptrace调用

其他潜在的黑客包括预加载库,它通过一些技巧实现分离


更好的替代方法是使用跟踪工具systemtap或trace cmd,它可以使用内核提供的跟踪基础结构而不是ptrace。

cat/proc/sys/kernel/yama/ptrace\u scope
0之后,我遇到了相同的错误。pid 13953]ptrace(ptrace_-TRACEME,0,0,0)=-1 EPERM(不允许操作)尽管我使用root并且
cat/proc/sys/kernel/yama/ptrace_scope
产生0,但我还是得到了错误。这个问题可能是由于进程在docker容器中运行。有这方面的经验吗?
strace strace -f ls