Ein Kollege sagte mir einmal, dass die letzte Option, wenn unter Linux nicht alles debuggt , die Verwendung von strace war .
Ich habe versucht, die Wissenschaft hinter diesem seltsamen Tool zu lernen, aber ich bin kein Systemadministrator und habe keine wirklichen Ergebnisse erzielt.
So,
- Was ist es genau und was macht es?
- Wie und in welchen Fällen sollte es verwendet werden?
- Wie soll die Ausgabe verstanden und verarbeitet werden?
Kurz gesagt , in einfachen Worten , wie funktioniert dieses Zeug?
man strace
sehr einfach zu lesen und nützlich. (PS wusste bis gestern nichts über strace und kein Linux-Experte)Antworten:
Strace Übersicht
strace kann als leichter Debugger angesehen werden. Dadurch kann ein Programmierer / Benutzer schnell herausfinden, wie ein Programm mit dem Betriebssystem interagiert. Dies geschieht durch Überwachung von Systemaufrufen und -signalen.
Verwendet
gut, wenn Sie keinen Quellcode haben oder sich nicht die Mühe machen möchten, ihn wirklich durchzugehen.
Auch nützlich für Ihren eigenen Code, wenn Sie keine Lust haben, GDB zu öffnen, sondern nur daran interessiert sind, die externe Interaktion zu verstehen.
Eine gute kleine Einführung
Ich bin neulich auf dieses Intro gestoßen, um Strace Use zu verwenden: Strace Hello World
quelle
ltrace
stackoverflow.com/a/52012215/5884955-EFAULT
(oops, schreibgeschützt) buffer) oder-ENOENT
(oops, lief aus dem falschen Verzeichnis, in dem der relative Pfad nicht funktioniert hat).)In einfachen Worten verfolgt strace alle von einem Programm ausgegebenen Systemaufrufe zusammen mit ihren Rückkehrcodes. Denken Sie an Dinge wie Datei- / Socket-Operationen und viel dunkelere.
Dies ist am nützlichsten, wenn Sie über Kenntnisse in C verfügen, da hier Systemaufrufe genauer für Standardaufrufe der C-Bibliothek stehen würden.
Angenommen, Ihr Programm lautet / usr / local / bin / Husten. Verwenden Sie einfach:
oder
in 'out_file' schreiben.
Alle Strace-Ausgaben werden an stderr gesendet (Vorsicht, das schiere Volumen erfordert häufig eine Umleitung in eine Datei). In den einfachsten Fällen wird Ihr Programm mit einem Fehler abgebrochen und Sie können sehen, wo die letzten Interaktionen mit dem Betriebssystem in der Strace-Ausgabe stattgefunden haben.
Weitere Informationen sollten verfügbar sein mit:
quelle
strace listet alle Systemaufrufe auf , die von dem Prozess ausgeführt werden, auf den es angewendet wird. Wenn Sie nicht wissen, was Systemaufrufe bedeuten, können Sie nicht viel Kilometer damit sammeln.
Wenn Ihr Problem jedoch Dateien oder Pfade oder Umgebungswerte umfasst, können Sie durch Ausführen von strace auf dem problematischen Programm und Umleiten der Ausgabe in eine Datei und anschließendes Durchsuchen dieser Datei nach Ihrer Pfad- / Datei- / Umgebungszeichenfolge erkennen, was Ihr Programm tatsächlich versucht tun, im Unterschied zu dem, was Sie erwartet haben.
quelle
strace <prog_name>
ein Programm verfolgen.strace -o <out_file> <prog_name>
in eine Datei zu legenstrace -e open myprog
ODER für alle dateibezogenen Systemaufrufe:strace -e file myprog
Strace ist ein hervorragendes Tool zur Untersuchung von Produktionssystemen, bei denen Sie es sich nicht leisten können, diese Programme unter einem Debugger auszuführen. Insbesondere haben wir strace in den folgenden zwei Situationen verwendet:
Ein Beispiel für die Analyse mit strace finden Sie in meiner Antwort auf diese Frage .
quelle
Ich benutze strace die ganze Zeit, um Berechtigungsprobleme zu debuggen. Die Technik geht so:
Wo
gnome-calculator
ist der Befehl, den Sie ausführen möchten?quelle
strace -tfp PID überwacht die Systemaufrufe des PID-Prozesses, sodass wir unseren Prozess- / Programmstatus debuggen / überwachen können.
quelle
Strace kann als Debugging-Tool oder als primitiver Profiler verwendet werden.
Als Debugger können Sie sehen, wie bestimmte Systemaufrufe aufgerufen, ausgeführt und zurückgegeben wurden. Dies ist sehr wichtig, da Sie nicht nur sehen können, dass ein Programm fehlgeschlagen ist, sondern auch, WARUM ein Programm fehlgeschlagen ist. Normalerweise ist es nur ein Ergebnis einer miesen Codierung, die nicht alle möglichen Ergebnisse eines Programms erfasst. In anderen Fällen handelt es sich nur um fest codierte Pfade zu Dateien. Ohne Anstrengung kann man erraten, was wo und wie schief gelaufen ist. Mit strace erhalten Sie eine Aufschlüsselung eines Systemaufrufs. In der Regel sagt Ihnen schon ein Blick auf einen Rückgabewert viel.
Profiling ist eine andere Verwendung. Sie können damit die Ausführung jedes Systemaufrufs einzeln oder als Aggregat zeitlich festlegen. Dies reicht möglicherweise nicht aus, um Ihre Probleme zu beheben, wird jedoch die Liste der potenziellen Verdächtigen zumindest erheblich einschränken. Wenn in einer einzelnen Datei viele Fopen / Close-Paare angezeigt werden, öffnen und schließen Sie Dateien bei jeder Ausführung einer Schleife möglicherweise unnötig, anstatt sie außerhalb einer Schleife zu öffnen und zu schließen.
Ltrace ist Straces enger Cousin, auch sehr nützlich. Sie müssen lernen, zu unterscheiden, wo Ihr Engpass liegt. Wenn eine Gesamtausführung 8 Sekunden beträgt und Sie nur 0,05 Sekunden für Systemaufrufe aufwenden, hilft es Ihnen nicht viel, das Programm zu belasten. Das Problem liegt in Ihrem Code, der normalerweise ein logisches Problem ist, oder das Programm benötigt es tatsächlich so lange zu laufen.
Das größte Problem bei strace / ltrace ist das Lesen ihrer Ausgabe. Wenn Sie nicht wissen, wie die Anrufe getätigt werden oder zumindest die Namen der Systemaufrufe / Funktionen, wird es schwierig sein, die Bedeutung zu entschlüsseln. Zu wissen, was die Funktionen zurückgeben, kann auch sehr nützlich sein, insbesondere für verschiedene Fehlercodes. Während es ein Schmerz ist, zu entziffern, geben sie manchmal wirklich eine Perle des Wissens zurück; Als ich eine Situation sah, in der mir die Inodes ausgegangen waren, aber nicht der freie Speicherplatz, gaben mir alle üblichen Dienstprogramme keine Warnung, ich konnte einfach keine neue Datei erstellen. Das Lesen des Fehlercodes aus der Ausgabe von strace zeigte mir die richtige Richtung.
quelle
Strace ist ein Tool, mit dem Sie erfahren, wie Ihre Anwendung mit Ihrem Betriebssystem interagiert.
Dazu erfahren Sie, welches Betriebssystem Ihre Anwendung verwendet und mit welchen Parametern sie aufgerufen wird.
So sehen Sie beispielsweise, welche Dateien Ihr Programm zu öffnen versucht, und ob der Aufruf erfolgreich ist.
Mit diesem Tool können Sie alle möglichen Probleme beheben. Wenn die Anwendung beispielsweise angibt, dass sie keine Bibliothek finden kann, von der Sie wissen, dass Sie sie installiert haben, teilt Ihnen strace mit, wo die Anwendung nach dieser Datei sucht.
Und das ist nur eine Spitze des Eisbergs.
quelle
strace ist ein gutes Werkzeug, um zu lernen, wie Ihr Programm verschiedene Systemaufrufe (Anforderungen an den Kernel) ausführt, und meldet auch diejenigen, die fehlgeschlagen sind, zusammen mit dem mit diesem Fehler verbundenen Fehlerwert. Nicht alle Fehler sind Fehler. Beispielsweise kann ein Code, der versucht, nach einer Datei zu suchen, einen ENOENT-Fehler (keine solche Datei oder kein solches Verzeichnis) erhalten, dies kann jedoch ein akzeptables Szenario in der Logik des Codes sein.
Ein guter Anwendungsfall für die Verwendung von strace ist das Debuggen von Race-Bedingungen während der temporären Dateierstellung. Beispielsweise kann ein Programm, das möglicherweise Dateien durch Anhängen der Prozess-ID (PID) an eine vorher festgelegte Zeichenfolge erstellt, in Multithread-Szenarien auf Probleme stoßen. [Eine PID + TID (Prozess-ID + Thread-ID) oder ein besserer Systemaufruf wie mkstemp beheben dies].
Es ist auch gut zum Debuggen von Abstürzen. Sie können diesen (meinen) Artikel über Strace- und Debugging-Abstürze nützlich finden.
quelle
Minimal lauffähiges Beispiel
Wenn ein Konzept nicht klar ist, gibt es ein einfacheres Beispiel, das Sie nicht gesehen haben und das es erklärt.
In diesem Fall ist dieses Beispiel die freistehende (keine libc) Hallo-Welt der Linux x86_64-Assembly:
hallo.S
GitHub stromaufwärts .
Zusammenbauen und ausführen:
Gibt das erwartete aus:
Verwenden wir nun Strace für dieses Beispiel:
Wir gebrauchen:
env -i ASDF=qwer
So steuern Sie die Umgebungsvariablen: /unix/48994/how-to-run-a-program-in-a-clean-environment-in-bash-s999 -v
um umfassendere Informationen in den Protokollen anzuzeigenstrace.log
enthält jetzt:Bei einem so minimalen Beispiel ist jedes einzelne Zeichen der Ausgabe selbstverständlich:
execve
Zeile: Zeigt an, wie siestrace
ausgeführt wirdhello.out
, einschließlich der CLI-Argumente und der Umgebung, wie unter dokumentiertman execve
write
Zeile: Zeigt den Schreibsystemaufruf an, den wir durchgeführt haben.6
ist die Länge der Zeichenfolge"hello\n"
.= 6
ist der Rückgabewert des Systemaufrufs, der, wie in dokumentiert,man 2 write
die Anzahl der geschriebenen Bytes ist.exit
Zeile: Zeigt den von uns getätigten Aufruf des Exit-Systems an. Es gibt keinen Rückgabewert, da das Programm beendet wurde!Komplexere Beispiele
Die Anwendung von strace dient natürlich dazu, festzustellen, welche Systemaufrufe komplexe Programme tatsächlich ausführen, um das Debuggen / Optimieren Ihres Programms zu unterstützen.
Insbesondere haben die meisten Systemaufrufe, die unter Linux wahrscheinlich auftreten, Glibc-Wrapper, viele davon von POSIX .
Intern verwenden die glibc-Wrapper die Inline-Assembly mehr oder weniger folgendermaßen: Wie rufe ich einen Systemaufruf über sysenter in der Inline-Assembly auf?
Das nächste Beispiel, das Sie studieren sollten, ist eine POSIX-
write
Hallo-Welt:Haupt c
Kompilieren und ausführen:
Dieses Mal werden Sie sehen, dass eine Reihe von Systemaufrufen von glibc ausgeführt werden, bevor
main
eine schöne Umgebung für main eingerichtet wird.Dies liegt daran, dass wir jetzt kein freistehendes Programm verwenden, sondern ein allgemeineres glibc-Programm, das libc-Funktionen ermöglicht.
Dann
strace.log
enthält an jedem Ende :Wir schließen daraus, dass die
write
POSIX-Funktion überraschenderweise den Linuxwrite
-Systemaufruf verwendet.Wir beobachten auch, dass dies
return 0
zu einemexit_group
Anruf statt führtexit
. Ha, ich wusste nichts davon! Deshalbstrace
ist es so cool.man exit_group
dann erklärt:Und hier ist ein weiteres Beispiel, in dem ich untersucht habe, welche Systemaufrufe
dlopen
verwendet werden: /unix/226524/what-system-call-is-used-to-load-libraries-in-linux/462710#462710Getestet in Ubuntu 16.04, GCC 6.4.0, Linux Kernel 4.4.0.
quelle
Hier sind einige Beispiele, wie ich mit strace in Websites grabe. Hoffe das ist hilfreich.
Überprüfen Sie die Zeit bis zum ersten Byte wie folgt:
Sehen Sie, wie viel Prozent der Aktionen was tun. Viele
lstat
undfstat
könnten ein Hinweis darauf sein, dass es Zeit ist, den Cache zu leeren:Gibt a aus,
trace.txt
damit Sie genau sehen können, welche Anrufe getätigt werden.Verwenden Sie diese auf prüfen , ob irgendetwas zwischen nahm
.1
zu.9
einer Sekunde Last:Sehen Sie, welche fehlenden Dateien oder Verzeichnisse in der
strace
. Dies wird eine Menge Dinge ausgeben, die unser System betreffen - die einzigen relevanten Bits betreffen die Dateien des Kunden:quelle
Ich mochte einige der Antworten, in denen
strace
überprüft wird, wie Sie mit Ihrem Betriebssystem interagieren.Genau das können wir sehen. Das System ruft auf. Wenn Sie vergleichen
strace
undltrace
der Unterschied ist offensichtlicher.Auf der anderen Seite gibt es,
ltrace
dass Funktionen verfolgt.Obwohl ich die Handbücher mehrmals überprüft habe, habe ich den Ursprung des Namens nicht gefunden,
strace
aber es handelt sich wahrscheinlich um eine Systemaufrufverfolgung, da dies offensichtlich ist.Es gibt drei größere Notizen zu sagen
strace
.Hinweis 1: Beide Funktionen
strace
undltrace
verwenden den Systemaufrufptrace
. Soptrace
Systemaufruf ist effektiv , wiestrace
funktioniert.Hinweis 2: Es gibt verschiedene Parameter, mit denen Sie arbeiten können
strace
, dastrace
diese sehr ausführlich sein können. Ich experimentiere gerne damit,-c
was wie eine Zusammenfassung der Dinge ist. Basierend auf-c
können Sie einen Systemaufruf auswählen,-e trace=open
bei dem nur dieser Aufruf angezeigt wird. Dies kann interessant sein, wenn Sie untersuchen, welche Dateien während des von Ihnen verfolgten Befehls geöffnet werden. Und natürlich können Sie dasgrep
für den gleichen Zweck verwenden, aber beachten Sie, dass Sie wie2>&1 | grep etc
folgt umleiten müssen, um zu verstehen, dass auf Konfigurationsdateien verwiesen wird, als der Befehl ausgegeben wurde.Anmerkung 3: Ich finde diese sehr wichtige Anmerkung. Sie sind nicht auf eine bestimmte Architektur beschränkt.
strace
wird Sie umhauen, da es über Binärdateien verschiedener Architekturen verfolgen kann.quelle