GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Linux strace Command Tutorial für Anfänger (8 Beispiele)

Die Linux-Befehlszeile bietet viele Tools, die für Softwareentwickler hilfreich sind. Eine davon ist strace , deren Grundlagen wir in diesem Tutorial anhand einiger leicht verständlicher Beispiele besprechen werden.

Aber bevor wir das tun, ist es erwähnenswert, dass alle Beispiele in diesem Artikel auf einem Ubuntu 18.04 LTS- und Debian 10-Rechner getestet wurden.

Mit dem Befehl strace in Linux können Sie Systemaufrufe und -signale verfolgen. Es folgt die Syntax:

strace [OPTIONS] command

Und so erklärt es die Manpage des Tools:

       In  the simplest case strace runs the specified command until it exits.
       It intercepts and records the  system  calls  which  are  called  by  a
       process  and  the signals which are received by a process.  The name of
       each system call, its arguments and its return  value  are  printed  on
       standard error or to the file specified with the -o option.

strace is a useful diagnostic, instructional, and debugging tool.  Sys?
       tem administrators, diagnosticians and trouble-shooters  will  find  it
       invaluable  for  solving problems with programs for which the source is
       not readily available since they do not need to be recompiled in  order
       to trace them.  Students, hackers and the overly-curious will find that
       a great deal can be learned about a system  and  its  system  calls  by
       tracing  even  ordinary programs.  And programmers will find that since
       system calls and signals are events  that  happen  at  the  user/kernel
       interface,  a close examination of this boundary is very useful for bug
       isolation, sanity checking and attempting to capture race conditions.

Im Folgenden finden Sie einige Beispiele im Q&A-Stil, die Ihnen eine bessere Vorstellung davon vermitteln sollen, wie der Befehl strace funktioniert.

Strace-Befehl installieren

Der Befehl strace ist auf den meisten Systemen nicht standardmäßig installiert, um ihn auf Debian und Ubuntu zu installieren, führen Sie diesen Befehl aus:

sudo apt-get install strace

Q1. Wie wird der Befehl strace verwendet?

Die grundlegende Verwendung ist einfach, führen Sie einfach 'strace' mit einem Befehl als Eingabe aus. Zum Beispiel habe ich es mit dem ls-Befehl verwendet:

strace ls

Und hier ist die auf meinem System erzeugte Ausgabe:

Q2. Wie ist die Ausgabe von strace zu verstehen?

Wie Sie im Screenshot im vorherigen Abschnitt sehen können, erzeugt der Befehl strace eine Menge Ausgaben. Sie müssen sich also bewusst sein, wie Sie es verstehen.

Die folgenden Auszüge aus der Manpage bieten eine auf den Punkt gebrachte Erklärung:

       Each line in the trace contains the system call name, followed  by  its
       arguments  in parentheses and its return value.  An example from strac?
       ing the command "cat /dev/null" is:

           open("/dev/null", O_RDONLY) = 3

       Errors (typically a return value of -1) have the errno symbol and error
       string appended.

           open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)

       Signals are printed as signal symbol and decoded siginfo structure.  An
       excerpt from stracing and interrupting the command "sleep 666" is:

           sigsuspend([] <unfinished ...>
           --- SIGINT {si_signo=SIGINT, si_code=SI_USER, si_pid=...} ---
           +++ killed by SIGINT +++

Q3. Wie erstelle ich einen Strichdruck-Anweisungszeiger?

Es gibt eine Option -i, die strace anweist, den Anweisungszeiger zum Zeitpunkt des Systemaufrufs zu drucken.

Zum Beispiel:

strace -i ls

Hier ist die Ausgabe:

So können Sie sehen, dass der Anweisungszeiger in jeder Zeile der Ausgabe gedruckt wurde.

Q4. Wie kann man einen Strace-Zeitstempel für jeden Systemaufruf drucken?

Es gibt eine Befehlszeilenoption -r, die strace anweist, beim Eintritt in jeden Systemaufruf einen relativen Zeitstempel anzuzeigen. Die Manpage des Tools besagt, dass dies den Zeitunterschied zwischen dem Beginn aufeinanderfolgender Systemaufrufe aufzeichnet.

Zum Beispiel:

strace -r ls

Das Folgende ist die von diesem Befehl erzeugte Ausgabe:

So können Sie sehen, dass am Anfang jeder Zeile ein relativer Zeitstempel erzeugt wurde.

Q5. Wie wird jeder Ausgabezeile die Uhrzeit vorangestellt?

Wenn Sie möchten, dass jede Zeile in der strace-Ausgabe mit der Uhrzeit beginnt, können Sie dies mit der Befehlszeilenoption -t tun.

Zum Beispiel:

strace -t ls

Hier ist die Ausgabe dieses Befehls auf meinem System:

So können Sie sehen, dass die Systemzeit am Anfang jeder Zeile gedruckt wurde.

Beachten Sie, dass es zwei weitere verwandte Optionen gibt, die strace anbietet:

-tt         
If given twice, the time printed will include the microseconds.

-ttt       
If given thrice, the  time  printed  will  include  the microseconds and the leading portion will
be printed as the number of seconds since the epoch.

Q6. Wie kann man Strace dazu bringen, die in Systemaufrufen verbrachte Zeit anzuzeigen?

Dies kann mit der Befehlszeilenoption -T erreicht werden.

Zum Beispiel:

strace -T ls

Es folgt die Ausgabe:

Damit Sie sehen können, wie viel Zeit in Systemaufrufen verbracht wird, wird am Ende jeder Zeile gedruckt.

F7. Wie bringt man strace dazu, eine Zusammenfassung anstelle der üblichen Ausgabe zu drucken?

Die Befehlszeilenausgabe -c kann verwendet werden, wenn Sie möchten, dass das Tool eine Zusammenfassung erstellt.

Beispielsweise der folgende Befehl:

strace -c ls

erzeugte diese Ausgabe auf meinem System:

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 93.66    0.000133           5        28           write
  6.34    0.000009           1        11           close
  0.00    0.000000           0         7           read
  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.000142                   120        10 total

So können Sie sehen, dass die Zusammenfassung Ihnen eine Vorstellung davon gibt, wie viele Aufrufe pro Syscall getätigt wurden, sowie zeitbezogene Informationen für jeden Syscall.

Schlussfolgerung

Wir haben hier nur an der Oberfläche gekratzt, da der Befehl strace noch viele andere Funktionen bietet. Wenn Sie alles, was wir hier besprochen haben, geübt haben, besuchen Sie die Manpage von strace, um mehr über das Tool zu erfahren.


Linux
  1. Linux-CD-Befehls-Tutorial für Anfänger (8 Beispiele)

  2. Linux-Kommando-Tutorial für Anfänger (5 Beispiele)

  3. Linux-df-Befehls-Tutorial für Anfänger (8 Beispiele)

  4. Linux Date Command Tutorial für Anfänger (8 Beispiele)

  5. Linux du Command Tutorial für Anfänger (10 Beispiele)

Linux-nm-Befehls-Tutorial für Anfänger (10 Beispiele)

Linux OD Command Tutorial für Anfänger (6 Beispiele)

Linux w Command Tutorial für Anfänger (5 Beispiele)

Linux passwd Command Tutorial für Anfänger (8 Beispiele)

Linux ss Command Tutorial für Anfänger (8 Beispiele)

Linux chattr Command Tutorial für Anfänger (5 Beispiele)