【问题标题】:Stracing by pid, child processes included按 pid 跟踪,包括子进程
【发布时间】:2015-03-11 07:28:17
【问题描述】:

我是 strace 的新手,我想 strace 一个分叉的孩子。因为我想以普通用户的身份执行此操作,所以我想通过其 pid 进行 strace 的进程需要是跟踪进程(strace)的子进程,因此我需要分叉两次。在 bash 中:

( ( sleep 1; echo "I'm echoed from a child of strace" )& exec strace -p $! ) 
#the sleep is for giving strace time to attach itself

这一切都有效,但是我也想跟踪被跟踪进程的子进程,一旦我将 -f 开关添加到 strace,就会出现错误:

( ( sleep 1; echo "I'm echoed from a child of strace" )& exec strace -fp $! ) 
#=> strace: attach: ptrace(PTRACE_ATTACH, ...): No such process

有什么建议吗?

【问题讨论】:

    标签: linux fork strace


    【解决方案1】:

    您可以跟踪自己用户的所有进程,而不仅仅是strace 的子进程。

    至于你遇到的问题,可以改写如下命令:

    strace -f bash -c 'sleep 1; echo "Im echoed from a child of strace"'

    【讨论】:

    • 不在 ubuntu 上我不能。他们为此制定了一项令人震惊的安全政策。不过,您正在做的是通过运行给它命令参数来创建 strace 的孩子。我没有要监视的命令参数。我想监控一个更大的套件中的一个分支。我可以通过使用参数生成该分支,但这将再次遍历所有设置代码。这就是为什么我宁愿通过 pid 进行 fork 和 strace,但我还需要 strace 分支调用的进程(使用 -f 开关)而不仅仅是分支本身。 bash 代码只是为了简单的说明问题。
    • 能够追踪不是您孩子的进程是一种安全威胁——一个被黑的用户级应用程序将能够监听其他应用程序正在做什么,例如,了解密码那样。
    • 这可以被禁用——见这里:wiki.ubuntu.com/Security/Features#ptrace
    • @PSkocik No such process 错误的问题似乎在 strace 4.10 中消失了。
    【解决方案2】:

    问题是你不需要exec,这里的例子:

    ( ( sleep 3; sleep 10 & sleep 20 & sleep 30 )& strace -fp $! )
    

    您将看到您确实获得了所有子进程的 strace:

    ...
    [pid   166] wait4(-1,  <unfinished ...>
    [pid   174] <... nanosleep resumed> NULL) = 0
    [pid   174] close(1)                    = 0
    [pid   174] close(2)                    = 0
    [pid   174] exit_group(0)               = ?
    [pid   174] +++ exited with 0 +++
    [pid   166] <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 174
    [pid   166] wait4(-1,  <unfinished ...>
    [pid   175] <... nanosleep resumed> NULL) = 0
    [pid   175] close(1)                    = 0
    [pid   175] close(2)                    = 0
    ...
    

    ps axf 输出(使用不同的 PID):

      202 ?        S      0:00          \_ bash
      203 ?        S      0:00          |   \_ bash
      210 ?        S      0:00          |   |   \_ sleep 10
      211 ?        S      0:00          |   |   \_ sleep 20
      212 ?        S      0:00          |   |   \_ sleep 30
      204 ?        S      0:00          |   \_ strace -fp 203
    

    在 Ubuntu 14.04 上测试,用户没有特殊权限,并且启用了 ptrace 范围检查。

    【讨论】:

    • 当没有 exec ` ( ( sleep 3; sleep 10 & sleep 20 & sleep 30 )& strace -fp $!) strace: attach: ptrace(PTRACE_ATTACH, ...): Operation not allowed无法附加到进程。如果您的 uid 与目标进程的 uid 匹配,请检查 /proc/sys/kernel/yama/ptrace_scope 的设置,或以 root 用户身份重试。有关更多详细信息,请参阅 /etc/sysctl.d/10-ptrace.conf` 我的 /etc/sysctl.d/10-ptrace.conf 有 kernel.yama.ptrace_scope = 1(不能更改)。
    • 这很奇怪,我的也有kernel.yama.ptrace_scope = 1,我为此创建了一个测试用户,没有任何特殊权限。我确实收到与您使用 exec 相同的消息,因为它以不同的方式分叉。您能告诉我您的确切 Ubuntu 版本,以便我可以将我的虚拟机切换到该版本并重试吗?
    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多