Ответ 1
strace -f
для отслеживания дочернего процесса, который fork()
ed.
Я использовал strace
для краткого присоединения к процессу. Процесс создал 90 потоков. Когда я нашел оскорбительную нить, мне пришлось утомительно искать родительский поток, потом поток дедушки и т.д. Вплоть до корневого процесса.
Есть ли уловка или инструмент, чтобы быстро определить, какой поток создал другой? Или еще лучше напечатать дерево создания потоков, например pstree
?
strace -f
для отслеживания дочернего процесса, который fork()
ed.
Существует perl script, называемый strace-graph
. Вот версия из github. Он упакован с версиями компиляторов crosstool-ng. Он работает для меня даже для использования кросс-платформы.
$ ./strace -f -q -s 100 -o app.trc -p 449
$ tftp -pr app.trc 172.0.0.133
$ ./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%
Вывод может использоваться для навигации по основному журналу трассировки.
Я не вижу простой способ:
Вы можете использовать опцию -ff
с -o filename
для создания нескольких файлов (по одному на pid).
например:
strace -o process_dump -ff ./executable
grep clone process_dump*
который поможет вам понять, какой родитель создал что. Возможно, это поможет вам - по крайней мере, тогда вы можете искать назад.