Comment suivre le processus enfant à l'aide de strace?

104

J'avais l'habitude stracede m'attacher brièvement à un processus. Le processus a créé 90 threads. Lorsque j'ai trouvé le fil offensant, j'ai dû rechercher fastidieusement le fil parent, puis le fil des grands-parents, et ainsi de suite jusqu'au processus racine.

Existe-t-il une astuce ou un outil pour déterminer rapidement quel thread en a créé un autre? Ou mieux encore, imprimez l'arbre des créations de fils comme pstree?

projets ont
la source
Il semble que la réponse @JeRog devrait être acceptée.
jww

Réponses:

119

strace -fpour tracer le processus enfant qui est fork()ed.

Je Rog
la source
19

Je ne vois pas un moyen facile:

Vous pouvez utiliser l' -ffoption avec -o filenamepour 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 alors vous pourriez rechercher en arrière.

compagnon de pile
la source
18

Il existe un script perl appelé strace-graph. Voici une version de github . Il est fourni avec les versions crosstool-ng des compilateurs. Cela fonctionne pour moi même utilisé multi-plateforme.

Boîte ARM Linux.

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

Boîte Linux X86_64.

$ ./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 faciliter la navigation dans le journal de suivi principal.

bruit naïf
la source
1
très sympa, c'est presque exactement quelque chose que je voulais depuis au moins plusieurs jours. étonnamment, je peux même le voir dans mon / usr / share / doc / strace / examples /.
mykhal
0

Pour capturer le trafic pour un seul processus, vous pouvez utiliser strace, comme @stackmate l'a suggéré.

strace -f -e trace=network -s 10000 -p <PID>;

ou le sortir dans un fichier.

strace -f -e trace=network -s 10000 -o dumpfile -p <PID>

-fpour tous les processus fourchus, -spour la taille de chaîne à imprimer et -opour vider la sortie dans un fichier.

Shaboti
la source