strac zur Fehlerbehebung bei der Interprozesskommunikation

strac zur Fehlerbehebung bei der Interprozesskommunikation

Ich habe die Ausgabe mit folgendem Befehl erfasst:

strace -f -e trace=process,socketpair,open,close,dup,dup2,read,write -o rsync.log rsync -avcz --progress src/ dst/

es ist ein bisschen lang, deshalb habe ich es hochgeladenHier. Ich verstehe das grundlegende Ausgabeformat strace, beispielsweise folgende Zeile:

1399 open("/lib/x86_64-linux-gnu/libpopt.so.0", O_RDONLY|O_CLOEXEC) = 3

Bedeutet, dass:

  1. 1399ist die PID des Prozesses
  2. open(const char *pathname, int flags);ist ein Systemaufruf mit bestimmten Argumenten (entnommen aus man 2 open)
  3. 3ist der Rückgabewert, in diesem speziellen Fall ein Dateideskriptor (entnommen aus man 2 open)

EntsprechendDasFaden:

rsyncerzeugt zwei Prozesse/Threads zum Ausführen des Kopiervorgangs, und es gibt einen Datenstream zwischen den Prozessen und einen weiteren vom empfangenden Prozess zur Zieldatei.

Die Verwendung von etwas wie strace -e trace=process,socketpair,open,read,writewürde einige gestartete Threads, das zwischen ihnen erstellte Socket-Paar und verschiedene Threads zeigen, die die Eingabe- und Ausgabedateien öffnen.

Kann ich stracedie Ausgabe irgendwie analysieren, um Anweisungen aus dem genannten Thread bestätigen zu können und zu sehen, was im Hintergrund passiert, auch wenn ich mit der Kommunikation zwischen Prozessen nicht sehr vertraut bin? Mich interessiert insbesondere der Datenaustausch zwischen Prozessen/Threads (wie viele Daten wurden von Prozess1 an Prozess2 weitergegeben? Wohin hat Prozess2 die empfangenen Daten geschrieben?)

Ich habe im Protokoll auch Zeilen wie diese gesehen, weiß aber nicht, wie ich sie richtig interpretieren soll:

1399  <... close resumed> )             = 0
1400  <... dup2 resumed> )              = 0

Antwort1

  • -yIch empfehle, das Flag für zu verwenden strace. Es druckt die mit den Dateideskriptorargumenten verknüpften Pfade.

  • -eist ein Qualifizierer für trace, es können die gewünschten Systemaufrufe verpasst werden.

Ich denke, es ist besser, alle Systemaufrufe und Signale ohne Qualifizierung auszugeben, dann können Sie damit grepdie gewünschten Informationen filtern, Beispiel unten:

grep -E 'dup2\(|clone\(|execve\(|\(open|write|close|openat|F_DUPFD|exit_group' trace.log

verwandte Informationen