So verwenden Sie strace zum Überwachen von Linux-Systemaufrufen

Ein stilisiertes Terminalfenster auf einem Laptop-PC.

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

Die Kernel- und Systemaufrufe

So schlau sie auch sein mögen, Computerprogramme können nicht alles für sich selbst tun. Sie müssen Anfragen stellen, um bestimmte Funktionen für sie ausführen zu lassen. Diese Anfragen gehen an den Linux-Kernel. Normalerweise gibt es eine Bibliothek oder eine andere Softwareschnittstelle, die das Programm aufruft, und die Bibliothek stellt dann die entsprechende Anforderung – einen sogenannten Systemaufruf – an den Kernel.

In der Lage zu sein, die Systemaufrufe eines Programms und die Antworten zu sehen, kann Ihnen helfen, das Innenleben von Programmen zu verstehen, die Sie interessieren oder die Sie geschrieben haben. Das ist Was strace tut. Es kann helfen, Probleme zu beheben und nach Engpässen zu suchen.

Das ist nicht dasselbe wie eine Anwendung debuggen mit einem werkzeug wie gdb . Mit einem Debugging-Programm können Sie den internen Betrieb eines Programms untersuchen, während es ausgeführt wird. Sie können die Logik Ihres Programms durchgehen und Speicher- und Variablenwerte überprüfen. Zum Vergleich, was? strace Erfasst die Systemaufrufinformationen, während das Programm ausgeführt wird. Wenn das verfolgte Programm beendet wird, strace listet die Systemaufrufinformationen im Terminalfenster auf.

Systemaufrufe bieten alle Arten von Low-Level-Funktionen, wie Lese- und Schreibaktionen für Dateien, Beenden von Prozessen usw. Es gibt eine Liste mit Hunderten von Systemaufrufen auf dem syscalls man-Seite.

VERBUNDEN: 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 es zu demonstrieren strace. Es tut 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 verwenden können strace.

#include <stdio.h>

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

  // file handle 
  FILE *fileGeek;

  // open a file called "strace_demo.txt", or create it 
  fileGeek = fopen("strace_demo.txt", "w");

  // write some text to the file 
  fprintf(fileGeek, "Write this to the file" );

  // close the file 
  fclose(fileGeek);

  // exit from program 
  return (0); 

} // end of main

Wir haben dies in einer Datei namens „file-io.c“ gespeichert und mit . kompiliert gcc in eine ausführbare Datei namens stex, benannt nach „stRennen Exreichlich.“

gcc -o stex file-io.c

Wir rufen an strace von der Befehlszeile aus und übergeben Sie 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 kleines Programm aus zwei Gründen.

Verwandt :  Sperrt den Zugriff auf ablenkende Apps auf Ihrem Telefon, damit Sie arbeiten können

Der erste Grund ist das strace ist ausführlich. Es kann viel ausgegeben werden. Das ist großartig, wenn Sie verwenden strace vor Wut, aber es kann anfangs überwältigend sein. Es ist begrenzt strace Ausgabe für unser kleines Programm. Der zweite Grund ist, dass unser Programm eine eingeschränkte Funktionalität hat und der Quellcode kurz und unkompliziert ist. Dies macht es einfacher zu erkennen, welche Abschnitte der Ausgabe sich auf die verschiedenen Teile der internen Abläufe des Programms beziehen.

strace ./stex

Wir können das deutlich sehen write Systemaufruf sendet den Text „Schreiben Sie dies in die Datei“ an unsere geöffnete Datei und die exit_group Systemaufruf. 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 eine Menge Output. Wir können die nutzen -e (Ausdruck)-Option. Wir übergeben den Namen des Systemaufrufs, den wir sehen möchten.

strace -e write ./stex

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

strace -e close,write ./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 möchten, aber Sie sehen nichts anderes. Und einige dieser anderen Ausgaben könnten für Sie nützlicher sein als die Dinge, die Sie sehen möchten.

Manchmal ist es bequemer, alles zu erfassen und die gesamten Ergebnisse zu durchsuchen und zu scrollen. So schließen Sie nichts Wichtiges aus Versehen aus. Das -o Mit der Option (Ausgabe) können Sie die Ausgabe von a . senden strace Sitzung in eine Textdatei.

strace -o trace-output.txt ./stex

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

less trace-output.txt

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

VERBUNDEN: So verwenden Sie den less-Befehl unter Linux

Hinzufügen von Zeitstempeln

Sie können der Ausgabe mehrere verschiedene Zeitstempel hinzufügen. Das -r (Relative Timestamps) Option fügt Zeitstempel hinzu, die den Zeitunterschied zwischen dem Start jedes aufeinanderfolgenden Systemaufrufs anzeigen. Beachten Sie, dass diese Zeitwerte die Zeit umfassen, die für den vorherigen Systemaufruf aufgewendet wurde, und alles andere, was das Programm vor dem nächsten Systemaufruf getan hat.

strace -r ./stex

Die Zeitstempel werden am Anfang jeder Ausgabezeile angezeigt.

Um die für jeden Systemaufruf aufgewendete Zeit anzuzeigen, verwenden Sie die use -T (Systemaufruf-Zeiten) Option. Dies zeigt die Zeitdauer an, die innerhalb jedes Systemaufrufs verbracht wurde.

strace -T ./stex

Die Zeitdauern werden am Ende jeder Systemrufleitung angezeigt.

Verwandt :  Die Google-Suche hat jetzt einen Gitarrentuner; So greifen Sie darauf zu

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

strace -tt ./stex

Die Zeiten werden am Anfang jeder Zeile angezeigt.

Verfolgen eines laufenden Prozesses

Wenn der Prozess, den Sie verfolgen möchten, bereits läuft, können Sie ihn noch anhängen strace dazu. Dazu müssen Sie die Prozess-ID kennen. Sie können verwenden ps mit grep um dies zu finden. Bei uns läuft Firefox. Um die ID des . herauszufinden firefox Prozess, den wir verwenden können ps und rohr es durch grep.

ps -e | grep firefox

Wir sehen, dass die Prozess-ID 8483 lautet. Wir verwenden die -p (Prozess-ID) Option zu sagen strace an welchen Prozess angehängt werden soll. Beachten Sie, dass Sie verwenden müssen sudo :

sudo strace -p 8483

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

Erstellen eines Berichts

Das -c (nur Zusammenfassung) Option Ursachen strace um einen Bericht zu drucken. Es generiert eine Tabelle mit Informationen zu den Systemaufrufen, die vom verfolgten Programm getätigt wurden.

strace -c ./stex

Die Spalten sind:

  • % Zeit: 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 wurde.
  • usecs/call: Die durchschnittliche Zeit in Mikrosekunden für jeden Systemaufruf.
  • Anrufe: Die Häufigkeit, mit der jeder Systemaufruf ausgeführt wurde.
  • Fehler: Die Anzahl der Fehler für jeden Systemaufruf.
  • Systemaufruf: Der Name des Systemaufrufs.

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

Tiefe Einblicke, ganz einfach

Das strace Ausgabe kann Ihnen zeigen, welche Systemaufrufe getätigt werden, welche wiederholt ausgeführt werden und wie viel Ausführungszeit innerhalb des Kernel-seitigen Codes verbracht wird. Das sind tolle 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.

Durch die Nutzung strace, sehen Sie das komplette Bild.

Moyens Staff
Moyens I/O-Personal. motivierte Sie und gab Ratschläge zu Technologie, persönlicher Entwicklung, Lebensstil und Strategien, die Ihnen helfen werden.