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


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

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

3 78

3 ответа:

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

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

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*

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