web-dev-qa-db-fra.com

Comment suivre les processus enfants en utilisant strace?

J'ai utilisé strace pour m'attacher brièvement à un processus. Le processus a créé 90 threads. Lorsque j'ai trouvé le thread incriminé, j'ai dû chercher péniblement le thread parent, puis le thread grand-parent, et ainsi de suite jusqu'au processus racine.

Existe-t-il une astuce ou un outil pour déterminer rapidement quel fil en a créé un autre? Ou mieux encore, imprimez l’arborescence des créations de threads comme pstree?

92
projectshave

strace -f Pour suivre le processus enfant qui est fork() ed.

98
Je Rog

Il y a un script Perl appelé strace-graph. Voici un version de github . Il est fourni avec les versions de crosstool-ng des compilateurs. Cela fonctionne pour moi même utilisé cross plate-forme.

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%

La sortie peut être utilisée pour vous aider à naviguer dans le journal de trace principal.

18
artless noise

Je ne peux pas voir un moyen facile:

Vous pouvez utiliser le -ff option avec -o filename pour produire plusieurs fichiers (un par pid).

par exemple:

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

cela vous aiderait à voir quel parent a créé quoi. Peut-être que cela vous aiderait - au moins, vous pourriez chercher en arrière.

17
stackmate