gpt4 book ai didi

macos - 如何在Mac OS X上获取truss以成功跟踪子进程?

转载 作者:行者123 更新时间:2023-12-02 05:39:06 25 4
gpt4 key购买 nike

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 X上进行一些Haskell开发,并想跟踪 cabal(Haskell的构建系统)运行过程中发生的情况。在cabal上运行 dtruss -f根本不做任何事情,因为在OS X版本的Haskell平台中, /usr/bin/cabal是shell脚本,其中 exec/Library/Haskell/bin/cabal.real。当然,我可以通过直接运行 /Library/Haskell/bin/cabal.real来解决该问题,但这仍然买不到我很多东西,因为 cabal.real只是可以解决,而 exec还有很多其他功能。 (如果您不熟悉Haskell,请考虑使用 make。)

最佳答案

鉴于dtruss只是一个高级dtrace脚本,您可以轻松编写自己的脚本并捕获所有fork/exec调用,从而在这些新创建的进程上生成新的dtrace脚本并进行跟踪。另一个选项是-W选项检查man dtrace。

关于macos - 如何在Mac OS X上获取truss以成功跟踪子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29910243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com