Wie soll strace verwendet werden?
Frage
Ein Kollege hat mir einmal gesagt, dass die letzte Option, wenn alles auf Linux debuggen ausgefallen war a href zu verwenden <= „http://man7.org/linux/man-pages/man1/strace.1.html“ rel = "noreferrer"> strace .
Ich habe versucht, die Wissenschaft hinter diesem seltsamen Werkzeug zu lernen, aber ich bin kein System Admin-Guru und ich habe nicht wirklich Ergebnisse erhalten.
So
- Was ist das genau und was tut sie?
- Wie und in welchen Fällen sollte verwendet werden?
- Wie sollte die Ausgabe verstanden und verarbeitet?
Kurz gesagt, in einfachen Worten , wie funktioniert dieses Zeug Arbeit?
Lösung
Strace Übersicht
Strace kann als ein geringes Gewicht Debugger zu sehen. Es ermöglicht ein Programmierer / Anwender schnell, um herauszufinden, wie ein Programm mit dem Betriebssystem interagiert. Es tut dies durch die Überwachung der Systemaufrufe und Signale.
Verwendung
Gut, wenn Sie durch sie nicht Quellcode haben oder wollen nicht belästigt werden wirklich gehen.
Auch nützlich für Ihren eigenen Code, wenn Sie nicht das Gefühl, wie GDB eröffnen, sondern sind nur daran interessiert, zu verstehen externe Interaktion.
Eine gute kleine Einführung
Ich lief in diesem Intro Verwendung nur den anderen Tag strace: Strace Hallo Welt
Andere Tipps
In einfachen Worten, strace zeichnet alle Systemaufrufe von einem Programm ausgegeben zusammen mit ihrem Rückgabecodes. Denken Sie Dinge wie Datei / Socket-Operationen und vieles mehr obskuren.
Es ist sehr nützlich, wenn Sie einige Kenntnisse von C haben, da hier Systemaufrufe würden genauer stehen für Standard-C-Bibliothek Anrufe.
Nehmen wir an, Ihr Programm / usr / local / bin / Husten. Verwenden Sie einfach:
strace /usr/local/bin/cough <any required argument for cough here>
oder
strace -o <out_file> /usr/local/bin/cough <any required argument for cough here>
zu schreiben, in 'out_file'.
Alle Strace Ausgabe auf stderr gehen wird (Vorsicht, fragt die schiere Menge der es oft für eine Umleitung in eine Datei). In den einfachsten Fällen wird abgebrochen Ihr Programm mit einem Fehler und Sie werden in der Lage sein zu sehen, was, wo seine letzten Interaktionen mit dem Betriebssystem in Strace Ausgabe.
Weitere Informationen sollten mit zur Verfügung
man strace
strace listet alle Systemaufrufe durch den Prozess getan es angewendet wird. Wenn Sie nicht wissen, was Systemaufrufe bedeuten, werden Sie nicht in der Lage sein, viele Kilometer von ihm zu erhalten.
Dennoch, wenn Ihr Problem beinhaltet Dateien oder Pfade oder Umgebungswerte, strace auf dem problematischen Programm ausgeführt wird und die Ausgabe in eine Datei umleiten und dann greppen diese Datei für Ihren Pfad / Datei / env-String können Ihnen helfen, zu sehen, was Ihr Programm wirklich versucht zu tun, im Unterschied von dem, was man erwartet, dass es zu.
Strace steht als Werkzeug aus für die Untersuchung von Produktionssystemen, bei denen man sich nicht leisten können diese Programme unter einem Debugger ausgeführt werden. Insbesondere haben wir strace in den beiden folgenden Situationen verwendet:
- Programm foo scheint in einer Sackgasse zu sein und nicht mehr reagiert. Dies könnte ein Ziel für GDB sein; Wir haben jedoch nicht immer hatten den Quellcode oder manchmal mit vorbereiteter Sprache zu tun hatten, die nicht geradlinig waren unter einem Debugger ausgeführt werden. In diesem Fall laufen Sie strace auf ein bereits laufendes Programm und Sie werden die Liste der Systemaufrufe bekommen gemacht. Dies ist besonders nützlich, wenn Sie eine Client / Server-Anwendung oder eine Anwendung untersuchen, die mit einer Datenbank interagiert
- Die Untersuchung, warum ein Programm langsam ist. Insbesondere hatten wir nur auf ein neues verteiltes Dateisystem verschoben und der neue Durchsatz des Systems war sehr langsam. Sie können strace mit dem ‚-T‘ Option angeben, die Ihnen sagen, wie viel Zeit wurde in jedem Systemaufruf ausgegeben. Dies trug dazu bei, um festzustellen, warum das Dateisystem Dinge verursacht wurde zu verlangsamen.
Ein Beispiel für die Analyse unter Verwendung von strace siehe meine Antwort href="https://stackoverflow.com/questions/186338/why-is-requireonce-so-bad-to-use#194959"> diese Frage .
Ich verwende Strace die ganze Zeit zu debuggen Berechtigungsprobleme. Die Technik geht so:
$ strace -e trace=open,stat,read,write gnome-calculator
Wo gnome-calculator
ist der Befehl, den Sie ausführen möchten.
strace -tfp PID wird der PID-Prozess des Systems Anrufe überwachen, so können wir unser Prozess / Programmstatus debuggen / überwachen.
Strace kann als Debugging-Tool oder als primitive Profiler verwendet werden.
Als Debugger können Sie sehen, wie angegeben Systemaufrufe genannt wurden, durchgeführt und was sie zurückkehren. Dies ist sehr wichtig, da es Ihnen erlaubt, nicht nur zu sehen, dass ein Programm nicht, aber warum ein Programm fehlgeschlagen. Normalerweise ist es nur ein Ergebnis von lausig Codierung nicht alle möglichen Ergebnisse eines Programms zu kontrollieren. Andere Male ist es nur Pfade zu Dateien fest einprogrammiert. Ohne Strace bekommen Sie, was falsch wo zu erraten ging und wie. Mit strace Sie einen Zusammenbruch eines syscall bekommen, in der Regel nur bei einem Rückgabewert suchen sagt viel.
Profilieren ist eine andere Verwendung. Sie können es an der Zeit der Ausführung jedes syscalls verwenden einzeln oder als Aggregat. Zwar ist dies nicht genug sein könnte, um Ihre Probleme zu beheben, ist es zumindest stark die Liste der möglichen Verdächtigen einengen wird. Wenn Sie eine Menge von fopen / Schließ-Paare auf einer einzigen Datei zu sehen, werden Sie wahrscheinlich unnecessairly öffnen und schließen Dateien jeder Ausführung einer Schleife, statt Öffnen und Schließen sie außerhalb einer Schleife.
ltrace ist Strace enger Cousin, auch sehr nützlich. Sie müssen lernen, zu differenzieren, wo Ihr Engpass ist. Wenn eine Gesamtausführungs 8 Sekunden, und Sie verbringen nur 0.05secs auf Systemaufrufe, dann stracing das Programm wird Ihr viel Gutes nicht tun, ist das Problem in Ihrem Code, die in der Regel ist ein logisches Problem, oder das Programm tatsächlich benötigt nimmt so lange laufen zu lassen.
Das größte Problem mit strace / ltrace ihre Ausgabe liest. Wenn Sie nicht wissen, wie die Anrufe gemacht oder zumindest die Namen der syscalls / Funktionen, es wird schwierig sein, die Bedeutung zu entziffern. Zu wissen, was die Funktionen Rückkehr auch sehr vorteilhaft sein kann, besonders für verschiedene Fehlercodes. Zwar ist es ein Schmerz ist, zu entschlüsseln, kehren sie manchmal wirklich eine Perle des Wissens; sobald ich eine Situation sah, wo ich aus Inodes lief, aber nicht aus freien Raum, damit alle üblichen Anwendungen nicht geben Sie mir keine Warnung, ich konnte einfach nicht um eine neue Datei machen. Lesen Sie den Fehlercode aus Strace der Ausgang wies mich in die richtige Richtung.
Strace ist ein Werkzeug, das Ihnen sagt, wie Sie Ihre Anwendung mit dem Betriebssystem interagiert.
Es tut dies, indem ich Ihnen, was OS-System ruft Ihre Anwendung verwendet und mit welchen Parametern es nennt sie.
So zum Beispiel sehen Sie, welche Dateien Ihr Programm versucht, zu öffnen und Wetter der Aufruf erfolgreich ist.
Sie können debuggen alle möglichen Probleme mit diesem Tool. Zum Beispiel, wenn die Anwendung sagt, dass es nicht Bibliothek finden können, die Sie wissen, dass Sie installiert haben Strace würden Sie sagen, wo die Anwendung für diese Datei sucht.
Und das ist nur die Spitze des Eisbergs.
strace ist ein gutes Werkzeug für das Lernen, wie Ihr Programm verschiedene Systemaufrufe (Anfragen an den Kernel) macht und berichtet auch diejenigen, die mit diesem Versagen zusammen mit dem Fehlerwert ausgefallen. Nicht alle Fehler sind Fehler. Zum Beispiel kann ein Code, der für eine Datei zu suchen versuchen, kann eine ENOENT (Keine solche Datei oder das Verzeichnis) Fehler erhalten, aber das kann ein akzeptables Szenario in der Logik des Codes sein.
Ein guter Anwendungsfall von strace verwendet, ist zu debuggen Rennbedingungen während Erstellung von temporären Dateien. Zum Beispiel kann ein Programm, das Dateien durch Anhängen der Prozess-ID (PID) zu einem gewissen Vorentscheidung String erschaffen können Probleme in Multi-Threaded-Szenarien gegenüberstellen können. [A PID + TID (Prozess-ID + Thread-ID) oder ein besserer Systemaufruf wie mkstemp dies behebt].
Es ist auch gut für Abstürze debuggen. Sie können feststellen, diese (meine) Artikel über strace und Debuggen stürzt nützlich.
Ich mochte einige der Antworten, wo es strace
prüft liest, wie Sie mit dem Betriebssystem interagiert.
Das ist genau das, was wir sehen können. Das System ruft. Wenn Sie strace
und ltrace
der Unterschied vergleichen ist offensichtlich.
$>strace -c cd
Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
0.00 0.000000 0 7 read
0.00 0.000000 0 1 write
0.00 0.000000 0 11 close
0.00 0.000000 0 10 fstat
0.00 0.000000 0 17 mmap
0.00 0.000000 0 12 mprotect
0.00 0.000000 0 1 munmap
0.00 0.000000 0 3 brk
0.00 0.000000 0 2 rt_sigaction
0.00 0.000000 0 1 rt_sigprocmask
0.00 0.000000 0 2 ioctl
0.00 0.000000 0 8 8 access
0.00 0.000000 0 1 execve
0.00 0.000000 0 2 getdents
0.00 0.000000 0 2 2 statfs
0.00 0.000000 0 1 arch_prctl
0.00 0.000000 0 1 set_tid_address
0.00 0.000000 0 9 openat
0.00 0.000000 0 1 set_robust_list
0.00 0.000000 0 1 prlimit64
------ ----------- ----------- --------- --------- ----------------
100.00 0.000000 93 10 total
Auf der anderen Seite gibt es ltrace
die Funktionen nachzeichnet.
$>ltrace -c cd
Desktop Documents Downloads examples.desktop Music Pictures Public Templates Videos
% time seconds usecs/call calls function
------ ----------- ----------- --------- --------------------
15.52 0.004946 329 15 memcpy
13.34 0.004249 94 45 __ctype_get_mb_cur_max
12.87 0.004099 2049 2 fclose
12.12 0.003861 83 46 strlen
10.96 0.003491 109 32 __errno_location
10.37 0.003303 117 28 readdir
8.41 0.002679 133 20 strcoll
5.62 0.001791 111 16 __overflow
3.24 0.001032 114 9 fwrite_unlocked
1.26 0.000400 100 4 __freading
1.17 0.000372 41 9 getenv
0.70 0.000222 111 2 fflush
0.67 0.000214 107 2 __fpending
0.64 0.000203 101 2 fileno
0.62 0.000196 196 1 closedir
0.43 0.000138 138 1 setlocale
0.36 0.000114 114 1 _setjmp
0.31 0.000098 98 1 realloc
0.25 0.000080 80 1 bindtextdomain
0.21 0.000068 68 1 opendir
0.19 0.000062 62 1 strrchr
0.18 0.000056 56 1 isatty
0.16 0.000051 51 1 ioctl
0.15 0.000047 47 1 getopt_long
0.14 0.000045 45 1 textdomain
0.13 0.000042 42 1 __cxa_atexit
------ ----------- ----------- --------- --------------------
100.00 0.031859 244 total
Auch wenn ich die Handbücher einige Zeit geprüft, ich habe nicht den Ursprung des Namens strace
gefunden, aber es ist wahrscheinlich, System-Call-Trace, da dies offensichtlich ist.
Es gibt drei größere Notizen über strace
zu sagen.
Anmerkung 1: Diese beiden Funktionen strace
und ltrace
werden mit dem Systemaufruf ptrace
. So ptrace
Systemaufruf ist effektiv wie strace
funktioniert.
Die ptrace () Systemaufruf stellt ein Mittel bereit, durch die ein Verfahren (das „Tracers“) kann beobachten und steuern die Ausführung eines anderen Prozesses (Die „Tracee“), und prüft, und den Speicher des Tracee ändern und Register. Es ist in erster Linie zu implementieren Breakpoint-Debugging verwendet und Systemaufruf zu verfolgen.
Hinweis 2: Es gibt verschiedene Parameter, die Sie mit strace
verwenden können, da strace
sehr umfangreich sein können. Ich mag mit -c
experimentieren, die wie eine Zusammenfassung der Dinge. Basierend auf -c
Sie ein System-Aufruf wie -e trace=open
wählen können, wo Sie nur diesen Anruf sehen. Dies kann interessant sein, wenn Sie untersuchen, welche Dateien während des Befehls geöffnet werden Sie verfolgen.
Und natürlich können Sie die grep
für den gleichen Zweck verwenden, aber beachten Sie dieses 2>&1 | grep etc
umleiten müssen verstehen, dass Konfigurationsdateien referenziert werden, wenn der Befehl ausgegeben wurde.
Hinweis 3: Das finde ich sehr wichtig, zur Kenntnis. Sie sind nicht auf eine bestimmte Architektur beschränkt. strace
werden Sie umhauen, da es über Binärdateien verschiedenen Architekturen verfolgen kann.
Minimal runnable Beispiel
Wenn ein Konzept nicht klar ist, gibt es ein einfacheres Beispiel, dass Sie nicht gesehen haben, dass es erklärt.
In diesem Fall, dass beispielsweise die Linux x86_64 Montag freistehend (keine libc) Hallo Welt:
hello.S
.text
.global _start
_start:
/* write */
mov $1, %rax /* syscall number */
mov $1, %rdi /* stdout */
mov $msg, %rsi /* buffer */
mov $len, %rdx /* buffer len */
syscall
/* exit */
mov $60, %rax /* exit status */
mov $0, %rdi /* syscall number */
syscall
msg:
.ascii "hello\n"
len = . - msg
zusammenbauen und laufen:
as -o hello.o hello.S
ld -o hello.out hello.o
./hello.out
Gibt das erwartete:
hello
Jetzt ist verwenden lassen strace an diesem Beispiel:
env -i ASDF=qwer strace -o strace.log -s999 -v ./hello.out arg0 arg1
cat strace.log
Wir verwenden:
-
env -i ASDF=qwer
die Umgebungsvariablen zu steuern: viele von ihnen von POSIX .Intern die glibc-Wrapper verwenden Inline-Assembler mehr oder weniger wie folgt aus: Wie ein Systemaufruf über SYSENTER in Inline-Assembly aufzurufen?
Das nächste Beispiel Sie studieren sollen, ist ein POSIX
write
Hallo Welt:main.c
#define _XOPEN_SOURCE 700 #include <unistd.h> int main(void) { char *msg = "hello\n"; write(1, msg, 6); return 0; }
Kompilieren und Ausführen:
gcc -std=c99 -Wall -Wextra -pedantic -o main.out main.c ./main.out
Dieses Mal werden Sie sehen, dass von glibc ein Bündel von Systemaufrufen gemacht werden, bevor
main
zur Einrichtung einer schönen Umgebung für Haupt.Das ist, weil wir jetzt nicht ein freistehendes Programm, sondern ein häufiges glibc-Programm, das für libc-Funktionalität ermöglicht.
Dann wird in jedem Ende,
strace.log
enthält:write(1, "hello\n", 6) = 6 exit_group(0) = ? +++ exited with 0 +++
So schließen wir, dass die
write
POSIX-Funktion verwendet, Überraschung !, das Linuxwrite
Systemaufruf.Wir beobachten auch, dass
return 0
zu einemexit_group
Anruf führt stattexit
. Ha, ich wusste nicht, über diese! Aus diesem Grundstrace
so cool ist.man exit_group
erklärt dann:Dieser Systemaufruf entspricht (2), außer, um zu beenden, dass es nicht nur den anrufenden Thread beendet wird, aber alle Fäden in der Fadengruppe des aufrufenden Prozesses.
Und hier ist ein weiteres Beispiel, wo ich studierte, welchen Systemaufruf
dlopen
verwendet: https://unix.stackexchange.com/questions/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.