Как отследить дочерний процесс, используя strace? - PullRequest
89 голосов
/ 29 октября 2010

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

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

Ответы [ 3 ]

93 голосов
/ 11 июня 2011

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

17 голосов
/ 15 мая 2013

Существует 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%

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

17 голосов
/ 30 апреля 2011

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

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

Например:

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

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

...