代码之家  ›  专栏  ›  技术社区  ›  sdgfsdh

为什么我的dtruss跟踪中没有execve调用?

  •  3
  • sdgfsdh  · 技术社区  · 6 年前

    我有一个这样的脚本:

    script.sh

    #!/bin/bash
    
    clang -v
    

    如果我做了 dtruss 在上面,我希望看到 execve 打电话给 clang .

    $ sudo dtruss -f -a -e ./script.sh 
    

    但是,跟踪不包含 系统调用 . 而是有一个错误:

    ...
     1703/0x16931:       856       4      0 sigaction(0x15, 0x7FFEE882A3B8, 0x7FFEE882A3F8)      = 0 0
     1703/0x16931:       858       4      0 sigaction(0x16, 0x7FFEE882A3C8, 0x7FFEE882A408)      = 0 0
     1703/0x16931:       874       4      0 sigaction(0x2, 0x7FFEE882A3C8, 0x7FFEE882A408)       = 0 0
     1703/0x16931:       881       4      0 sigaction(0x3, 0x7FFEE882A3C8, 0x7FFEE882A408)       = 0 0
     1703/0x16931:       883       4      0 sigaction(0x14, 0x7FFEE882A3C8, 0x7FFEE882A408)      = 0 0
    dtrace: error on enabled probe ID 2149 (ID 280: syscall::execve:return): invalid address (0x7fc2b5502c30) in action #12 at DIF offset 12
     1703/0x16932:      2873:        0:       0 fork()       = 0 0
     1703/0x16932:      2879     138      5 thread_selfid(0x0, 0x0, 0x0)         = 92466 0
     1703/0x16932:      2958       8      0 issetugid(0x0, 0x0, 0x0)         = 0 0
     1703/0x16932:      2975       8      1 csrctl(0x0, 0x7FFEEE21DC3C, 0x4)         = 0 0
     1703/0x16932:      2985      12      6 csops(0x0, 0x0, 0x7FFEEE21E550)      = 0 0
     1703/0x16932:      3100      13      3 shared_region_check_np(0x7FFEEE21DA98, 0x0, 0x0)    
    ...
    
    • 是什么导致了这个错误?
    • 我怎么才能拿到 系统调用 要显示的命令,以便我可以看到调用的程序及其参数?
    1 回复  |  直到 6 年前
        1
  •  2
  •   Dan    6 年前

    这意味着dtrace脚本 dtruss 正在内部使用访问无效的内存地址,这是在尝试跟踪 execve 打电话给你,你很好奇。所以基本上, 桁架 (或者可能是dtrace本身)似乎有一个阻止您获取所需信息的错误。不幸的是,苹果在保持DTrace和依赖于它的工具在MacOS上运行良好方面并不是最好的。

    特别是对于bash/shell脚本,可以通过添加 set -x 在脚本顶部(更多信息 in this other answer )

    如果您愿意,您也可以尝试直接使用dtrace——这是一个非常简单的一行程序(还没有尝试自己运行这个程序,所以如果有错,请道歉):

    sudo dtrace -n 'proc:::exec-success /ppid == $target/ { trace(curpsinfo->pr_psargs); }' -c './script.sh'
    

    工作方式是:

    • proc:::exec-success 追踪所有 exec-success 系统中的事件,触发 在子流程中 当一个 exec* -家庭系统调用成功返回。
    • /ppid == $target/ :筛选器,这意味着只有当父进程的PID( ppid )与为进程启动返回的PID匹配 -c 我们传递给 dtrace 命令( $target )
    • { trace(curpsinfo->pr_psargs); } :这是事件触发并与筛选器匹配时要采取的操作。我们只是打印( trace )传递给进程的参数,该参数存储在 curpsinfo 变量。

    (如果失败,并出现类似的错误,则很可能是MacOS的 姜黄素 某处)

    推荐文章