我有一个这样的脚本:
script.sh
#!/bin/bash
clang -v
如果我对它执行dtruss
,那么我希望看到对clang
的execve
调用。
$ sudo dtruss -f -a -e ./script.sh
但是,跟踪不包含execve
。相反,出现了一个错误:
...
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)
...
- 是什么导致了这个错误
- 如何显示
execve
命令,以便查看调用的程序及其参数
这意味着dtruss
内部使用的DTrace脚本正在访问一个无效的内存地址,这是在它试图跟踪您好奇的execve
调用时发生的。因此,基本上,dtruss
(或者可能是DTrace本身(似乎有一个错误,它阻止您获得所需的信息。不幸的是,苹果在保持DTrace和依赖它的工具在macOS上运行良好方面并不是最好的:-/。
特别是对于Bash/shell脚本,您可以通过在脚本顶部添加set -x
来打印它运行的每个命令(更多信息请参阅其他答案(。
如果你愿意,你也可以尝试直接使用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
(与我们传递给dtrace
命令($target
(的-c
选项启动的进程返回的PID匹配时,才会触发此筛选器{ trace(curpsinfo->pr_psargs); }
:这是当事件触发并且与我们的过滤器匹配时要采取的操作。我们只需打印(trace
(传递给进程的参数,这些参数存储在curpsinfo
变量中
(如果失败并出现类似的错误,则错误很可能在macOS的curpsinfo
实现中。(