So verwenden Sie strace zum Überwachen von Linux-Systemaufrufen

Veröffentlicht: 2022-01-29
Ein stilisiertes Terminalfenster auf einem Laptop-PC.
fatmawati achmad zaenuri/Shutterstock.com

Linux-Programme bitten den Kernel, einige Dinge für sie zu tun. Der Befehl strace deckt diese Systemaufrufe auf. Sie können sie verwenden, um zu verstehen, wie Programme funktionieren und warum sie es manchmal nicht tun.

Der Kernel und die Systemaufrufe

So schlau sie auch sein mögen, Computerprogramme können nicht alles für sich selbst erledigen. Sie müssen Anfragen stellen, damit bestimmte Funktionen für sie ausgeführt werden. Diese Anfragen gehen an den Linux-Kernel. Typischerweise gibt es eine Bibliothek oder eine andere Softwareschnittstelle, die das Programm aufruft, und die Bibliothek stellt dann die entsprechende Anfrage – Systemaufruf genannt – an den Kernel.

In der Lage zu sein, die Systemaufrufe zu sehen, die ein Programm gemacht hat, und was die Antworten waren, kann Ihnen helfen, das Innenleben von Programmen zu verstehen, die Sie interessieren oder die Sie geschrieben haben. Das macht strace . Es kann helfen, Probleme zu beheben und nach Engpässen zu suchen.

Dies ist nicht dasselbe wie das Debuggen einer Anwendung mit einem Tool wie gdb . Mit einem Debugging-Programm können Sie den internen Betrieb eines Programms untersuchen, während es ausgeführt wird. Damit können Sie die Logik Ihres Programms schrittweise durchlaufen und Speicher- und Variablenwerte überprüfen. Im Vergleich strace die Systemaufrufinformationen, während das Programm ausgeführt wird. Wenn das verfolgte Programm beendet wird, listet strace die Systemaufrufinformationen im Terminalfenster auf.

Systemaufrufe bieten alle möglichen Low-Level-Funktionen, wie z. B. Lese- und Schreibaktionen für Dateien, das Beenden von Prozessen und so weiter. Es gibt eine Liste mit Hunderten von Systemaufrufen auf der Manpage syscalls.

VERWANDT: Debuggen mit GDB: Erste Schritte

Strace installieren

Wenn strace noch nicht auf Ihrem Computer installiert ist, können Sie es ganz einfach installieren.

Verwenden Sie unter Ubuntu diesen Befehl:

 sudo apt install strace 

Geben Sie auf Fedora diesen Befehl ein:

 sudo dnf install strace 

Auf Manjaro lautet der Befehl:

 sudo pacman -Sy strace 

Erste Schritte mit strace

Wir werden ein kleines Programm verwenden, um strace zu demonstrieren. Es macht nicht viel: Es öffnet eine Datei und schreibt eine Textzeile hinein, und es hat keine Fehlerprüfung darin. Es ist nur ein schneller Hack, damit wir etwas mit strace verwenden können.

 #include <stdio.h>

int main(int argc, char argv[]) { 

  // Dateihandle 
  DATEI *fileGeek;

  // Öffne eine Datei namens "strace_demo.txt" oder erstelle sie 
  fileGeek = fopen("strace_demo.txt", "w");

  // etwas Text in die Datei schreiben 
  fprintf(fileGeek, "In die Datei schreiben" );

  // Datei schließen 
  fclose (fileGeek);

  // Programm verlassen 
  Rückkehr (0); 

} // Ende von main

Wir haben dies in einer Datei namens „file- io.c “ gespeichert und mit gcc in eine ausführbare Datei namens stex , die nach „ st race example“ benannt ist.

 gcc -o stex file-io.c

Wir rufen strace von der Befehlszeile aus auf und übergeben den Namen unserer neuen ausführbaren Datei als den Prozess, den wir verfolgen möchten. Wir könnten genauso einfach jeden der Linux-Befehle oder jede andere ausführbare Binärdatei verfolgen. Wir verwenden unser winziges Programm aus zwei Gründen.

Der erste Grund ist, dass strace ausführlich ist. Es kann viel ausgegeben werden. Das ist großartig, wenn Sie strace im Zorn anwenden, aber es kann anfangs überwältigend sein. Es gibt eine begrenzte strace -Ausgabe für unser winziges Programm. Der zweite Grund ist, dass unser Programm eine eingeschränkte Funktionalität hat und der Quellcode kurz und unkompliziert ist. Dadurch lässt sich leichter erkennen, welche Abschnitte der Ausgabe sich auf die verschiedenen Teile der internen Funktionsweise des Programms beziehen.

 spur ./stex 

Wir können deutlich sehen, wie der Systemaufruf „ write this to the file“ den Text „Write this to the file“ an unsere geöffnete Datei und den Systemaufruf „ exit_group “ sendet. Dadurch werden alle Threads in der Anwendung beendet und ein Rückgabewert an die Shell zurückgesendet.

Filtern der Ausgabe

Selbst mit unserem einfachen Demonstrationsprogramm gibt es ziemlich viel Output. Wir können die Option -e (Ausdruck) verwenden. Wir übergeben den Namen des Systemaufrufs, den wir sehen möchten.

 strace -e schreiben ./stex 

Anzeige

Sie können Berichte über mehrere Systemaufrufe erstellen, indem Sie sie als durch Kommas getrennte Liste hinzufügen. Fügen Sie keine Leerzeichen in die Liste der Systemaufrufe ein.

 strace -e schließen, schreiben ./stex 

Senden der Ausgabe an eine Datei

Der Vorteil des Filterns der Ausgabe ist auch das Problem beim Filtern der Ausgabe. Sie sehen, was Sie sehen wollten, aber Sie sehen nichts anderes. Und einige dieser anderen Ergebnisse könnten für Sie nützlicher sein als das Zeug, um das Sie gebeten haben.

Manchmal ist es bequemer, alles zu erfassen und den gesamten Ergebnissatz zu durchsuchen und zu scrollen. Auf diese Weise schließen Sie nichts Wichtiges versehentlich aus. Mit der Option -o (Ausgabe) können Sie die Ausgabe einer strace Sitzung an eine Textdatei senden.

 strace -o trace-output.txt ./stex 

Sie können dann den Befehl less verwenden, um durch die Liste zu blättern und nach Systemaufrufen – oder irgendetwas anderem – nach Namen zu suchen.

 weniger trace-output.txt 

Sie können jetzt alle Suchfunktionen von less verwenden, um die Ausgabe zu untersuchen.

VERWANDT: So verwenden Sie den Less-Befehl unter Linux

Hinzufügen von Zeitstempeln

Sie können der Ausgabe mehrere verschiedene Zeitstempel hinzufügen. Die Option -r (relative Zeitstempel) fügt Zeitstempel hinzu, die den Zeitunterschied zwischen dem Beginn jedes aufeinanderfolgenden Systemaufrufs anzeigen. Beachten Sie, dass diese Zeitwerte die im vorherigen Systemaufruf verbrachte Zeit und alles andere enthalten, was das Programm vor dem nächsten Systemaufruf getan hat.

 strace -r ./stex 

Anzeige

Die Zeitstempel werden am Anfang jeder Ausgabezeile angezeigt.

Um die für jeden Systemaufruf aufgewendete Zeit anzuzeigen, verwenden Sie die Option -T (syscall-times). Dies zeigt die Zeitdauer, die in jedem Systemaufruf verbracht wird.

 strace -T ./stex 

Die Zeitdauern werden am Ende jeder Systemrufzeile angezeigt.

Um die Zeit anzuzeigen, zu der jeder Systemaufruf aufgerufen wurde, verwenden Sie die Option -tt (absolute Zeitstempel). Dies zeigt die „Wanduhr“-Zeit mit einer Mikrosekunden-Auflösung.

 strace -tt ./stex 

Die Zeiten werden am Anfang jeder Zeile angezeigt.

Verfolgen eines laufenden Prozesses

Wenn der Prozess, den Sie verfolgen möchten, bereits ausgeführt wird, können Sie ihm immer noch strace . Dazu müssen Sie die Prozess-ID kennen. Sie können ps mit grep verwenden, um dies zu finden. Wir haben Firefox am Laufen. Um die ID des firefox Prozesses herauszufinden, können wir ps verwenden und durch grep .

 ps -e | grep firefox 

Anzeige

Wir können sehen, dass die Prozess-ID 8483 ist. Wir verwenden die Option -p (Prozess-ID), um strace mitzuteilen, an welchen Prozess sie angehängt werden soll. Beachten Sie, dass Sie sudo verwenden müssen:

 sudo strace -p 8483 

Sie sehen eine Benachrichtigung, dass sich strace an den Prozess angehängt hat, und dann werden die System-Trace-Aufrufe wie gewohnt im Terminalfenster angezeigt.

Erstellen eines Berichts

Die Option -c (nur Zusammenfassung) bewirkt, dass strace einen Bericht druckt. Es generiert eine Tabelle mit Informationen zu den Systemaufrufen, die von dem verfolgten Programm ausgeführt wurden.

 strace -c ./stex 

Die Spalten sind:

  • % time : Der Prozentsatz der Ausführungszeit, der für jeden Systemaufruf aufgewendet wurde.
  • Sekunden : Die Gesamtzeit in Sekunden und Mikrosekunden, die für jeden Systemaufruf aufgewendet wird.
  • usecs/call : Die durchschnittliche Zeit in Mikrosekunden, die für jeden Systemaufruf aufgewendet wird.
  • Aufrufe : Die Häufigkeit, mit der jeder Systemaufruf ausgeführt wurde.
  • Fehler : Die Anzahl der Fehler für jeden Systemaufruf.
  • syscall : Der Name des Systemaufrufs.

Diese Werte zeigen Nullen für triviale Programme, die schnell ausgeführt und beendet werden. Reale Werte werden für Programme angezeigt, die etwas Bedeutenderes tun als unsere Demonstrationsanwendung.

Tiefe Einblicke, ganz einfach

Die strace Ausgabe kann Ihnen zeigen, welche Systemaufrufe durchgeführt werden, welche wiederholt durchgeführt werden und wie viel Ausführungszeit innerhalb des Kernel-seitigen Codes verbracht wird. Das sind großartige Informationen. Wenn Sie versuchen zu verstehen, was in Ihrem Code vor sich geht, vergessen Sie oft, dass Ihre Binärdatei fast ununterbrochen mit dem Kernel interagiert, um viele seiner Funktionen auszuführen.

Wenn Sie strace verwenden, sehen Sie das vollständige Bild.

RELATED: Beste Linux-Laptops für Entwickler und Enthusiasten