Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Блок ARM Linux.

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

X86_64 Linux.

$ ./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%

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

Ответ 3

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

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

например:

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

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