首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Mac上让dtruss成功跟踪子进程?

如何在Mac上让dtruss成功跟踪子进程?
EN

Stack Overflow用户
提问于 2015-04-28 12:18:20
回答 1查看 2.3K关注 0票数 9

dtruss手册页上写着:

代码语言:javascript
运行
复制
       -f     follow children as they are forked

听起来就是我想要的。但是,请注意以下行为:

代码语言:javascript
运行
复制
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/cabalexec/Library/Haskell/bin/cabal.real的外壳脚本。当然,我可以通过直接运行/Library/Haskell/bin/cabal.real来解决这个问题,但这仍然不会给我带来太多好处,因为cabal.real只会转过身来,exec一大堆其他东西。(如果您不熟悉make,请考虑使用Haskell。)

EN

回答 1

Stack Overflow用户

发布于 2018-06-08 15:45:48

由于dtruss只是一个高级的dtrace脚本,您可以很容易地编写自己的脚本,并捕获所有的fork/exec调用,在这些新派生的进程上生成新的dtrace脚本并跟踪它们。另一个选项是-W选项check man dtrace。

票数 -4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29910243

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档