Příkazový řádek Linuxu nabízí mnoho nástrojů, které jsou užitečné pro vývojáře softwaru. Jedním z nich je strace , jehož základy probereme v tomto tutoriálu na několika snadno srozumitelných příkladech.
Ale než to uděláme, stojí za zmínku, že všechny příklady v tomto článku byly testovány na počítači Ubuntu 18.04 LTS a Debian 10.
Příkaz strace v Linuxu umožňuje sledovat systémová volání a signály. Následuje jeho syntaxe:
strace [OPTIONS] command
A zde je návod, jak to vysvětluje manuálová stránka nástroje:
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.
Následuje několik příkladů ve stylu otázek a odpovědí, které by vám měly poskytnout lepší představu o tom, jak příkaz strace funguje.
Instalace příkazu strace
Příkaz strace není ve výchozím nastavení na většině systémů nainstalován. Chcete-li jej nainstalovat na Debian a Ubuntu, spusťte tento příkaz:
sudo apt-get install strace
O1. Jak používat příkaz strace?
Základní použití je jednoduché, stačí provést 'strace' s příkazem jako vstupem. Například jsem to použil s příkazem ls:
strace ls
A zde je výstup vytvořený v mém systému:
Q2. Jak chápat výstup strace?
Jak můžete vidět na snímku obrazovky v předchozí části, příkaz strace produkuje velké množství výstupu. Takže si musíte být vědomi toho, jak to chápat.
Následující úryvky z manuálové stránky poskytují podrobné vysvětlení:
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 +++
O3. Jak vytvořit ukazatel instrukce pro tisk stop?
Existuje volba -i, která strace sdělí, aby vytiskl ukazatel instrukce v době systémového volání.
Například:
strace -i ls
Zde je výstup:
Můžete tedy vidět, že ukazatel instrukce byl vytištěn na každém řádku výstupu.
4. Jak vytvořit časové razítko pro tisk stop pro každé systémové volání?
Existuje volba -r příkazového řádku, která říká strace, aby zobrazil relativní časové razítko při vstupu do každého systémového volání. Manuálová stránka nástroje říká, že to zaznamenává časový rozdíl mezi začátkem po sobě jdoucích systémových volání.
Například:
strace -r ls
Následuje výstup vytvořený tímto příkazem:
Můžete tedy vidět, že na začátku každého řádku bylo vytvořeno relativní časové razítko.
O5. Jak předřadit každému výstupnímu řádku čas?
Pokud chcete, aby každý řádek ve strace výstupu začínal časem hodin, pak to lze provést pomocí volby příkazového řádku -t.
Například:
strace -t ls
Zde je výstup tohoto příkazu v mém systému:
Můžete tedy vidět, že systémový čas byl vytištěn na začátku každého řádku.
Všimněte si, že strace nabízí další dvě související možnosti:
-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.
O6. Jak zajistit, aby strace show čas strávený v systémových voláních?
Toho lze dosáhnout pomocí volby příkazového řádku -T.
Například:
strace -T ls
Následuje výstup:
Takže můžete vidět, že čas strávený systémovými voláními je vytištěn na konci každého řádku.
O7. Jak přimět strace tisknout souhrn místo obvyklého výstupu?
Výstup příkazového řádku -c lze použít, pokud chcete, aby nástroj vytvořil souhrn.
Například následující příkaz:
strace -c ls
vytvořil tento výstup na mém systému:
% 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
Můžete si tedy prohlédnout souhrn, který vám poskytne představu o tom, kolik hovorů bylo uskutečněno na jedno systémové volání, a také informace související s časem pro každé systémové volání.
Závěr
Právě jsme zde poškrábali povrch, protože příkaz strace nabízí také spoustu dalších funkcí. Jakmile dokončíte procvičování toho, co jsme zde probrali, přejděte na stránku manuálu strace, kde se o tomto nástroji dozvíte více.