Как я могу получить dtruss в Mac OS X для успешного отслеживания дочерних процессов?

dtruss Страница man говорит:

       -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%

Обратите внимание, что за исключением первого случая, "привет мир" не печатается. (И дело не только в том, что вывод не виден; если я запускаю процесс, который занимает много времени, это не займет времени в sh -c и подобные случаи. Во всех экспериментах, которые я провел, кажется, что выполнение просто останавливается на первом exec.)

Итак, я озадачен тем, что dtruss -f на самом деле Как я могу заставить его вести себя как strace -f на Linux, что делает то, что я хочу?

Мотивация: я занимаюсь разработкой на Haskell для OS X и хотел бы отследить, что происходит во время прогона cabal (Система сборки Haskell). Бег dtruss -f на Кабал возвращается, ничего не делая вообще, потому что в OSX версии платформы Haskell, /usr/bin/cabal это сценарий оболочки, который execs /Library/Haskell/bin/cabal.real, Конечно, я могу обойти эту проблему, просто запустив /Library/Haskell/bin/cabal.real напрямую, но это по-прежнему мало что мне дает, так как cabal.real просто собирается повернуться и exec куча других вещей. (Считать make если вы не знакомы с Haskell.)

1 ответ

Поскольку dtruss - это просто продвинутый сценарий dtrace, вы можете легко написать свой собственный и захватывать все вызовы fork/exec, порождать новые сценарии dtrace в этих вновь разветвленных процессах и отслеживать их. Другой вариант - опция -W check man dtrace.

Другие вопросы по тегам