So verwenden Sie strace zum Überwachen von Linux-Systemaufrufen
Veröffentlicht: 2022-01-29 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
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
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
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.
Linux-Befehle | ||
Dateien | tar · pv · cat · tac · chmod · grep · diff · sed · ar · man · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · type · rename · zip · unzip · mount · umount · install · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · konvertieren · rclone · shred · srm | |
Prozesse | alias · screen · top · nice · renice · progress · strace · systemd · tmux · chsh · history · at · batch · free · which · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · yes · kill · sleep · sudo · su · time · groupadd · usermod · groups · lshw · shutdown · reboot · halt · poweroff · passwd · lscpu · crontab · date · bg · fg | |
Vernetzung | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
RELATED: Beste Linux-Laptops für Entwickler und Enthusiasten