Gibt es eine Möglichkeit, die Interprozesskommunikation unter Unix / Linux abzufangen?


15

Zum Abfangen / Analysieren des Netzwerkverkehrs haben wir ein Hilfsprogramm namens Wireshark .

Verfügen wir über ein ähnliches Dienstprogramm zum Abfangen der gesamten Interprozesskommunikation zwischen zwei beliebigen Prozessen in Unix / Linux?

Ich habe einige Prozesse im Gedächtnis erstellt und ich muss ein Profil erstellen, wie sie miteinander kommunizieren.


1
Welche IPC-Mechanismen verwenden Sie für die Kommunikation?
axel_c 20.08.10

@axel_c: Die Prozessquelle ist nicht bei mir, aber ich glaube, ich habe irgendwo in der Dokumentation "Shared Memory" gelesen.
Lazer

Antworten:


19

Dies hängt stark vom Kommunikationsmechanismus ab.

  • Am transparentesten Ende des Spektrums können Prozesse über Internet-Sockets (dh IP ) kommunizieren . Dann können wireshark oder tcpdump den gesamten Datenverkehr anzeigen, indem sie auf die Loopback-Schnittstelle zeigen.

  • Auf mittlerer Ebene kann der Verkehr auf Rohren und Unix-Steckdosen mit truss/ strace/ trace/ ..., der Kettensäge der Schweizer Armee zur Systemverfolgung, beobachtet werden. Dies kann die Prozesse jedoch erheblich verlangsamen und ist möglicherweise nicht für die Profilerstellung geeignet.

  • Am undurchsichtigsten Ende des Spektrums gibt es Shared Memory. Das grundlegende Funktionsprinzip von Shared Memory besteht darin, dass die Zugriffe in jedem beteiligten Prozess vollständig transparent sind. Sie benötigen lediglich Systemaufrufe, um Shared Memory-Bereiche einzurichten. Das Verfolgen dieser Speicherzugriffe von außen wäre schwierig, insbesondere wenn Sie die Beobachtung benötigen, um das Timing nicht zu stören. Sie können Tools wie das Linux-Trace-Toolkit ausprobieren (erfordert einen Kernel-Patch) und prüfen, ob Sie nützliche Informationen extrahieren können. In diesem Bereich würde ich erwarten, dass Solaris ein besseres Tool hat (aber ich habe keine Kenntnis davon).

    Wenn Sie die Quelle haben, ist es möglicherweise die beste Option, den Funktionen der Schlüsselbibliothek Ablaufverfolgungsanweisungen hinzuzufügen. Dies kann mit LD_PRELOADTricks erreicht werden, auch wenn Sie nicht über die (gesamte) Quelle verfügen, sofern Sie über ausreichende Kenntnisse des Steuerungsflusses des Teils des Programms verfügen, der auf den gemeinsam genutzten Speicher zugreift.


6

Dies zeigt, was ein Prozess liest und schreibt:

strace -ewrite -p $PID

Es ist keine saubere Ausgabe (zeigt Zeilen wie: write (#,)), funktioniert aber! (und ist einzeilig: D) Sie mögen vielleicht auch nicht, dass Argumente abgekürzt sind. Um dies zu steuern, verwenden Sie den Parameter -s, der die maximale Länge der angezeigten Zeichenfolgen festlegt.

Es fängt alle Streams ab, also möchten Sie das vielleicht irgendwie filtern.

Sie können es filtern:

strace -ewrite -p $PID 2>&1 | grep "write(1"

Zeigt nur Deskriptor 1-Aufrufe an. 2> & 1 ist die Umleitung von stderr zu stdout, da strace standardmäßig nach stderr schreibt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.