GNU/Linux >> Znalost Linux >  >> Linux

Výukový program příkazu Linux strace pro začátečníky (8 příkladů)

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.


Linux
  1. Linux cd command tutorial pro začátečníky (8 příkladů)

  2. Výuka příkazů Linux pro začátečníky (5 příkladů)

  3. Linux Date Command Tutorial pro začátečníky (8 příkladů)

  1. Linux df Command Tutorial pro začátečníky (8 příkladů)

  2. Linux du Command Tutorial pro začátečníky (10 příkladů)

  3. Výukový program Linux echo Command pro začátečníky (5 příkladů)

  1. Linux env Command Tutorial pro začátečníky (5 příkladů)

  2. Návod k příkazu velikosti Linuxu pro začátečníky (6 příkladů)

  3. Linux kill Command Tutorial pro začátečníky (5 příkladů)