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?

War es hilfreich?

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.

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. eingeben Bild Beschreibung hier

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

GitHub Upstream .

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 Linux write Systemaufruf.

    Wir beobachten auch, dass return 0 zu einem exit_group Anruf führt statt exit. Ha, ich wusste nicht, über diese! Aus diesem Grund strace 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 # 462710

    Getestet in Ubuntu 16.04, GCC 6.4.0, Linux Kernel 4.4.0.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top