dtruss
手册页上写着:
-f follow children as they are forked
听起来就是我想要的。但是,请注意以下行为:
WhiteAndNerdy% uname -a
Darwin WhiteAndNerdy.local 13.4.0 Darwin Kernel Version 13.4.0: Wed Dec 17 19:05:52 PST 2014; root:xnu-2422.115.10~1/RELEASE_X86_64 x86_64
WhiteAndNerdy% sudo dtruss -f -t writev /bin/echo hello world
hello world
PID/THRD SYSCALL(args) = return
37273/0x90e264: writev(0x1, 0x7F8832D00000, 0x4) = 12 0
WhiteAndNerdy% sudo dtruss -f -t writev sh -c '/bin/echo hello world'
PID/THRD SYSCALL(args) = return
WhiteAndNerdy% sudo dtruss -f -t writev bash -c '/bin/echo hello world'
PID/THRD SYSCALL(args) = return
WhiteAndNerdy% sudo dtruss -f -t writev zsh -c '/bin/echo hello world'
PID/THRD SYSCALL(args) = return
37295/0x90e39b: fork() = 0 0
WhiteAndNerdy% sudo dtruss -f -t writev env /bin/echo hello world
PID/THRD SYSCALL(args) = return
WhiteAndNerdy%
请注意,除了第一种情况外,不会打印"hello world“。(这不仅仅是看不到输出的问题;如果我运行一个需要很长时间的进程,在sh -c
和类似的情况下也不会花费任何时间。在我所做的所有实验中,执行似乎只是在第一个exec
处停止。)
所以,我很困惑dtruss -f
到底是做什么的。我怎样才能让它的行为像Linux上的strace -f
一样,它能做我想要的事情?
动机:我正在OS上做一些Haskell开发,并想要跟踪在运行cabal
(Haskell的构建系统)期间发生了什么。在cabal上运行dtruss -f
完全不需要做任何事情,因为在Haskell平台的OS X版本中,/usr/bin/cabal
是exec
的/Library/Haskell/bin/cabal.real
的外壳脚本。当然,我可以通过直接运行/Library/Haskell/bin/cabal.real
来解决这个问题,但这仍然不会给我带来太多好处,因为cabal.real
只会转过身来,exec
一大堆其他东西。(如果您不熟悉make
,请考虑使用Haskell。)
发布于 2018-06-08 15:45:48
由于dtruss只是一个高级的dtrace脚本,您可以很容易地编写自己的脚本,并捕获所有的fork/exec调用,在这些新派生的进程上生成新的dtrace脚本并跟踪它们。另一个选项是-W选项check man dtrace。
https://stackoverflow.com/questions/29910243
复制相似问题