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.