So verwenden Sie strace zum Überwachen von Linux-Systemaufrufen

Inhalt

Ein stilisiertes Terminalfenster auf einem Laptop.

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

Die Kernel- und Systemaufrufe

Egal wie schlau sie sind, Computerprogramme können nicht alles alleine machen. Sie müssen Anfragen für die Ausführung bestimmter Funktionen stellen. Diese Anfragen gehen an den Linux-Kernel. Im Allgemeinen, es gibt eine Bibliothek oder eine andere Softwareschnittstelle, die das Programm aufruft, und dann stellt die Bibliothek die entsprechende Anfrage, Systemaufruf anrufen, al 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 das strace macht es. Kann helfen, Probleme zu beheben und Engpässe zu finden.

Das ist nicht dasselbe wie eine Anwendung debuggen mit einem werkzeug wie gdb . Ein Debugging-Programm ermöglicht es Ihnen, das Innenleben eines Programms zu untersuchen, während es läuft. Ermöglicht es Ihnen, durch Ihre Programmlogik zu gehen und Speicher- und Variablenwerte zu überprüfen. Verglichen, das strace es erfasst die Informationen des Systemaufrufs, während das Programm läuft. Wenn das verfolgte Programm endet, strace listet die Systemaufrufinformationen im Terminalfenster auf.

Systemaufrufe bieten alle Arten von Low-Level-Funktionen, als Lese- und Schreibaktionen auf Dateien, Prozessbeseitigung, usw. Es gibt eine Liste mit Hunderten von Systemaufrufen im Syscalls-Handbuchseite.

VERBUNDEN: Debuggen mit GDB: Einleitung

strace installieren

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

Unter Ubuntu, benutze diesen Befehl:

sudo apt install strace

In Fedora, schreibe diesen Befehl:

sudo dnf install strace

In Manjaro, der Befehl ist:

sudo pacman -Sy strace

Erste Schritte mit strate

Wir werden ein kleines Programm verwenden, um es zu demonstrieren strace. Vor nicht allzu langer Zeit: Öffnen Sie eine Datei und schreiben Sie eine Textzeile hinein, und es hat keinen Fehler bei der Überprüfung. Es ist nur ein schneller Trick, damit wir etwas verwenden können strace.

#enthalten <stdio.h>

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

  // file handle 
  FILE *fileGeek;

  // Öffnen Sie eine Datei namens "strace_demo.txt", or create it 
  fileGeek = fopen("strace_demo.txt", "w");

  // write some text to the file 
  fprintf(fileGeek, "Schreiben Sie dies in die Datei" );

  // close the file 
  fclose(fileGeek);

  // exit from program 
  return (0); 

} // Ende der Hauptsache

Wir speichern dies in einer Datei namens “file-io.c” und kompiliere es mit gcc in einer ausführbaren Datei aufgerufen stex, ernannt für “NSRaza exgroß.”

gcc -o stex file-io.c

Wir werden anrufen strace aus der Befehlszeile und übergeben Sie den Namen unserer neuen ausführbaren Datei als die Prozedur, die wir verfolgen möchten. Wir könnten leicht jeden der Linux-Befehle oder jede andere ausführbare Binärdatei verfolgen. Wir nutzen unser kleines Programm aus zwei Gründen.

Der erste Grund ist das strace es ist ausführlich. Es kann viele Ergebnisse geben. Das ist großartig, wenn Sie verwenden strace angepisst, aber es kann anfangs überwältigend sein. Es sind begrenzt strace Abfahrt für unser kleines Programm. Der zweite Grund ist, dass unser Programm eine eingeschränkte Funktionalität hat und der Quellcode kurz und einfach ist.. Dies macht es einfacher zu erkennen, welche Abschnitte der Ausgabe sich auf verschiedene Teile der internen Abläufe des Programms beziehen..

strace ./stex

Wir können das deutlich sehen write Systemaufruf, der den Text sendet “Schreiben Sie dies in die Datei” zu unserer offenen Datei und der exit_group Systemaufruf. Dies beendet alle Threads in der Anwendung und sendet einen Rückgabewert an die Shell.

Filtern Sie die Ausgabe

Auch mit unserem einfachen Demoprogramm, es gibt genug ausweg. Wir können die nutzen -e Möglichkeit (Ausdruck). Wir übergeben den Namen des Systemaufrufs, den wir sehen möchten.

strace -e schreiben ./stex

Sie können mehrere Systemaufrufe melden, 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,schreibe ./stex

Senden Sie die Ausgabe an eine Datei

Der Vorteil der Filterung der Ausgabe ist auch das Problem der Filterung der Ausgabe. Du siehst, was du sehen wolltest, aber du siehst nichts anderes. Und einige dieser anderen Ergebnisse können für Sie nützlicher sein als die Dinge, um die Sie gebeten haben..

Manchmal, Es ist bequemer, alles zu erfassen und die gesamte Ergebnismenge zu durchsuchen und zu scrollen. Dieser Weg, schließt nichts Wichtiges aus Versehen aus. das -o Die Option (Ausgang) ermöglicht Ihnen das Senden der Ausgabe von a strace Sitzung in eine Textdatei.

strace -o trace-output.txt ./stex

Nächste, du kannst den ... benutzen less Befehl, um durch die Liste zu scrollen und Systemaufrufe zu finden, oder irgendwas anderes, namentlich.

weniger trace-output.txt

Sie können jetzt alle verwenden lessSuchfunktionen, um den Ausgang zu untersuchen.

VERBUNDEN: So verwenden Sie den Befehl less unter Linux

Zeitstempel hinzufügen

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

strace -r ./stex

Zeitstempel werden am Anfang jeder Startzeile angezeigt.

Um die für jeden Systemaufruf aufgewendete Zeit anzuzeigen, benutze el -T (Systemaufruf-Zeiten) Möglichkeit. Dies zeigt die Zeitdauer an, die innerhalb jedes Systemaufrufs verstrichen ist.

strace -T ./stex

Die Zeitdauer wird am Ende jeder Systemanrufpräsentation angezeigt.

Um zu sehen, wann jeder Systemaufruf aufgerufen wurde, Verwenden Sie die -tt (absolute Zeitstempel). Dies zeigt die Zeit von “Wanduhr”, mit Mikrosekunden-Auflösung.

strace -tt ./stex

Die Zeiten werden am Anfang jeder Zeile angezeigt.

Nachverfolgung eines laufenden Verfahrens

Wenn das Verfahren, das Sie verfolgen möchten, bereits läuft, kann noch anhängen strace es. Es zu tun, Sie müssen die Prozedur-ID kennen. Sie können verwenden ps mit grep um das zu finden. Wir haben Firefox am Laufen. Um die ID des . herauszufinden firefox Prozess, wir können benutzen ps und kanalisiere es durch grep.

ps -e | grep Firefox

Wir können sehen, dass die Prozedur-ID ist 8483. Wir werden die verwenden -p (Verfahrens-ID) Option zu sagen strace Welche Prozedur soll angehängt werden. Bitte beachten Sie, dass Sie verwenden müssen sudo :

sudo strace -p 8483

Sie sehen eine Benachrichtigung, dass strace ist dem Verfahren beigefügt, und dann werden System-Trace-Aufrufe wie gewohnt im Terminalfenster angezeigt.

Erstellen Sie einen Bericht

das -c (nur zusammenfassend) Option verursacht strace einen Bericht drucken. Erzeugt eine Tabelle, um Informationen über die Systemaufrufe des verfolgten Programms zu erhalten.

strace -c ./stex

Die Spalten sind:

  • % Wetter: Der Prozentsatz der Ausführungszeit, der für jeden Systemaufruf aufgewendet wurde.
  • Sekunden: Die Gesamtzeit in Sekunden und Mikrosekunden für jeden Systemaufruf.
  • verwendet / Anruf: Die durchschnittliche Zeit in Mikrosekunden, die für jeden Systemaufruf aufgewendet wird.
  • 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. Reale Weltwerte werden für Programme angezeigt, die etwas Sinnvolleres tun als unsere Demo-Anwendung.

Tiefe Einblicke, leicht

das strace Die Ausgabe kann Ihnen anzeigen, welche Systemaufrufe getätigt werden, welche wiederholt werden und wie viel Ausführungszeit im Kernel-seitigen Code verbracht wird. Das sind tolle Informationen. Häufig, wenn Sie versuchen zu verstehen, was in Ihrem Code vor sich geht, Es ist leicht zu vergessen, dass Ihre Binärdatei fast ununterbrochen mit dem Kernel interagiert, um viele seiner Funktionen auszuführen.

Durch Nutzung strace, du siehst das ganze bild.

Abonniere unseren Newsletter

Wir senden Ihnen keine SPAM-Mail. Wir hassen es genauso wie du.