
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 less
Suchfunktionen, 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.