Как отслеживать дочерний процесс с помощью strace?

Я strace для краткого присоединения к процессу. Процесс создал 90 потоков. Когда я нашел оскорбительную нить, мне пришлось утомительно искать родительскую нить, затем нить бабушки и дедушки и так далее до самого корневого процесса.

есть ли трюк или инструмент, чтобы быстро выяснить, какой поток создал другой? Или еще лучше, распечатать дерево нитей творения, как pstree?

3 ответов


strace -f для отслеживания дочернего процесса это fork()ed.


есть скрипт strace-graph. Вот это версия от github. Он упакован с crosstool-ng версиями компиляторов. Это работает для меня даже используется cross platform.

ARM Linux box.

$ ./strace -f -q -s 100 -o app.trc -p 449
$ tftp -pr app.trc 172.0.0.133

x86_64 Linux box.

$ ./strace-graph /srv/tftp/app.trc 
 (anon)
  +-- touch /tmp/ppp.sleep
  +-- killall -HUP pppd
  +-- amixer set Speaker 70%
  +-- amixer set Speaker 70%
  +-- amixer set Speaker 70%
  +-- amixer set Speaker 70%
  +-- amixer set Speaker 50%
  +-- amixer set Speaker 70%
  `-- amixer set Speaker 50%

выходные данные можно использовать для навигации по основному журналу трассировки.


Я не вижу простого способа:

можно использовать С -o filename для создания нескольких файлов (по одному на pid).

например:

strace -o process_dump -ff ./executable
grep clone process_dump*

это поможет вам увидеть, какой родитель создал что. Возможно, это поможет вам-по крайней мере, тогда вы сможете искать в обратном направлении.