Wie kann man den Kinderprozess mit strace verfolgen?

104

Ich habe mich stracekurz an einen Prozess gebunden. Der Prozess hat 90 Threads erstellt. Als ich den fehlerhaften Thread gefunden habe, musste ich mühsam nach dem übergeordneten Thread suchen, dann nach dem übergeordneten Thread und so weiter bis zum Root-Prozess.

Gibt es einen Trick oder ein Werkzeug, um schnell herauszufinden, welcher Thread einen anderen erstellt hat? Oder noch besser, drucken Sie den Baum der Thread-Kreationen wie pstree?

projekte haben
quelle
Es scheint, als ob die Antwort von @JeRog akzeptiert werden sollte.
JWW

Antworten:

119

strace -funtergeordneten Prozess verfolgen, der fork()ed.

Je Rog
quelle
19

Ich kann keinen einfachen Weg sehen:

Sie können die -ffOption mit verwenden -o filename, um mehrere Dateien zu erstellen (eine pro PID).

z.B:

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

Das würde Ihnen helfen zu sehen, welcher Elternteil was erstellt hat. Vielleicht würde Ihnen das helfen - zumindest könnten Sie dann rückwärts suchen.

Stackmate
quelle
18

Es gibt ein Perl-Skript namens strace-graph. Hier ist eine Version von Github . Es ist mit Crosstool-ng- Versionen von Compilern verpackt . Es funktioniert bei mir sogar plattformübergreifend.

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%

Die Ausgabe kann zum Navigieren im Hauptablaufverfolgungsprotokoll verwendet werden.

Kunstloser Lärm
quelle
1
sehr schön, das ist fast genau etwas, was ich mir für mindestens einige Tage gewünscht habe. überraschenderweise kann ich es sogar in meinem / usr / share / doc / strace / examples / sehen.
Mykhal
0

Sie können den Datenverkehr für einen einzelnen Prozess erfassen strace, wie von @stackmate vorgeschlagen.

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

oder geben Sie es in eine Datei aus.

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

-ffür alle gegabelten Prozesse, -sdamit die Zeichenfolgengröße gedruckt und -odie Ausgabe in eine Datei ausgegeben wird.

Shaboti
quelle