So verwenden Sie strace zum Überwachen von Linux-Systemaufrufen

0
232
fatmawati achmad zaenuri/Shutterstock.com

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

Der Kernel und die Systemaufrufe

So intelligent sie auch sein mögen, Computerprogramme können nicht alles für sich selbst erledigen. 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, die als Systemaufruf bezeichnet wird, 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. Dies ist die Aufgabe von 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. Sie können die Logik Ihres Programms durchgehen und Speicher- und Variablenwerte überprüfen. Im Vergleich dazu erfasst 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 Funktionen auf niedriger Ebene, wie Lese- und Schreibaktionen für Dateien, Beenden von Prozessen usw., . Auf der Manpage syscalls finden Sie eine Liste mit Hunderten von Systemaufrufen.

VERWANDTE: Debugging 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 – System

Erste Schritte mit strace

Wir verwenden ein kleines Programm, um strace zu demonstrieren. Es macht nicht viel: Es öffnet eine Datei und schreibt eine Textzeile hinein, und es enthält keine Fehlerüberprüfung. Es ist nur ein kurzer Hack, damit wir etwas mit strace verwenden können.

#include <stdio.h> int main(int argc, char argv[]) { //Datei-Handle DATEI *fileGeek; //eine Datei namens “strace_demo.txt” öffnen oder erstellen fileGeek = fopen(“strace_demo.txt”, “w”); //schreibe etwas Text in die Datei fprintf(fileGeek, “Schreibe dies in die Datei”); //schließe die Datei fclose(fileGeek); //Verlassen des Programms return (0); } //end of main

Wir haben dies in einer Datei namens “file-io.c” und mit gcc in eine ausführbare Datei namens stex kompiliert, benannt nach “strace example.”

gcc -o stex file- io.c

Wir rufen strace von der Befehlszeile aus auf und übergeben ihr 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.

Der erste Grund ist, dass strace ausführlich ist. Es kann viel ausgegeben werden. Das ist großartig, wenn Sie strace im Zorn verwenden, aber es kann anfangs überwältigend sein. Die Ausgabe von strace für unser kleines Programm ist begrenzt. 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 Funktionsweise des Programms beziehen.

strace ./stex

Wir können deutlich sehen, wie der Systemaufruf write den Text “Schreibe dies in die Datei” auf unsere geöffnete Datei und den Systemaufruf exit_group. Dies beendet alle Threads in der Anwendung und sendet einen Rückgabewert zurück an die Shell.

< /p>

Filtern der Ausgabe

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

strace -e write ./stex

Werbung

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

Ausgabe an eine Datei senden

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 das gesamte zu durchsuchen und zu scrollen Reihe von Ergebnissen. Auf diese Weise schließen Sie nichts Wichtiges aus Versehen 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 mit dem Befehl less durch die Liste scrollen und nach Systemaufrufen—oder anderem—nach Namen suchen.

less trace-output.txt

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

< img src="http://www.howtogeek.com/pagespeed_static/1.JiBnMqyl6S.gif" />

VERBUNDEN: So verwenden Sie den less-Befehl auf Linux

Hinzufügen von Zeitstempeln

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

strace -r ./stex

Werbung

Die Zeitstempel werden am Anfang jeder Ausgabezeile angezeigt.

< p>Um die für jeden Systemaufruf aufgewendete Zeit anzuzeigen, verwenden Sie die Option -T (syscall-times). Dies zeigt die Dauer der einzelnen Systemaufrufe an.

strace -T ./stex

Die Zeitdauer wird am Ende jeder Systemrufzeile angezeigt.

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

strace -tt ./stex

< p>Die Zeiten werden am Anfang jeder Zeile angezeigt.

< h2 id="tracing-a-running-process">Verfolgen eines laufenden Prozesses

Wenn der Prozess, den Sie verfolgen möchten, bereits ausgeführt wird, können Sie ihn trotzdem mit strace verknüpfen. Dazu müssen Sie die Prozess-ID kennen. Sie können ps mit grep verwenden, um dies zu finden. Bei uns läuft Firefox. Um die ID des Firefox-Prozesses herauszufinden, können wir ps verwenden und es durch grep leiten.

ps -e | grep Firefox

Werbung

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

sudo strace -p 8483

< /p>

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 über die Systemaufrufe, die vom verfolgten Programm getätigt wurden.

strace -c ./stex

Die Spalten sind:

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

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

Deep Insights, Easy

The strace output kann Ihnen zeigen, welche Systemaufrufe getätigt werden, welche wiederholt ausgeführt werden und wie viel Ausführungszeit im Kernel-seitigen Code verbracht wird. Das sind tolle Informationen. Wenn Sie versuchen zu verstehen, was in Ihrem Code vor sich geht, vergessen Sie oft leicht, dass Ihre Binärdatei fast ununterbrochen mit dem Kernel interagiert, um viele seiner Funktionen auszuführen.

Mit strace sehen Sie das vollständige Bild.

WEITER LESEN

  • › Problembehebung “Dieser PC kann Windows 11 nicht ausführen”
  • › Windows 11: Was ist neu im neuen Betriebssystem von Microsoft
  • › Was sind die Mindestsystemanforderungen, um Windows 11 auszuführen?
  • › So überprüfen Sie, ob Ihr Windows 10-PC Windows 11 ausführen kann
  • › So verwenden Sie Handgesten mit dem Google Nest Hub