Linux strace Command Tutorial voor Beginners (8 Voorbeelden)

De Linux commando-regel biedt veel hulpmiddelen die nuttig zijn voor software ontwikkelaars. Eén daarvan is strace, een commando om Linux systeemaanroepen en signalen te traceren. De basisprincipes van strace zullen we in deze tutorial bespreken aan de hand van enkele eenvoudig te begrijpen voorbeelden.

Maar voor we dat doen, is het de moeite waard te vermelden dat alle voorbeelden in dit artikel getest zijn op een Ubuntu 22.04 LTS en Debian 11 machine.

Linux strace commando

Met het strace commando in Linux kun je systeemaanroepen en signalen traceren. Hieronder volgt de syntaxis ervan:

strace [OPTIONS] command

En hier is hoe de man pagina van het gereedschap het uitlegt:

       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.

Hieronder volgen enkele vraag-en-antwoord-achtige voorbeelden die je een beter idee moeten geven van hoe het strace commando werkt.

Installeren van het strace commando

Het strace commando is op de meeste systemen niet standaard geïnstalleerd, om het op Debian en Ubuntu te installeren, voer je dit commando uit:

sudo apt-get install strace

Q1. Hoe gebruik je het strace commando?

Het basisgebruik is eenvoudig, voer gewoon ‘strace’ uit met een commando als invoer. Ik gebruikte het bijvoorbeeld met het ls commando:

strace ls

En hier is de uitvoer die op mijn systeem werd geproduceerd:

Gebruik strace commando op Linux

Q2. Hoe kun je de uitvoer van strace begrijpen?

Zoals je in de schermafbeelding in de vorige sectie kunt zien, produceert het strace commando een heleboel uitvoer. Je moet je dus bewust zijn van hoe je die kunt begrijpen.

De volgende fragmenten uit de man pagina geven een to-the-point uitleg:

       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. Hoe kan strace instructie-aanwijzers laten afdrukken?

Er is een optie -i die strace vertelt om instructie pointer af te drukken op het moment van een systeemaanroep.

Bijvoorbeeld:

strace -i ls

Hier is de uitvoer:

Hoe strace instructie-aanwijzer laten afdrukken

Zo kun je zien dat de instructie pointer in elke regel in de uitvoer werd afgedrukt.

Q4. Hoe kun je strace een tijdstempel laten afdrukken voor elke systeemaanroep?

Er bestaat een -r command-line optie die strace vertelt om een relatieve tijdstempel af te beelden bij het binnengaan van elke systeemaanroep. De man pagina van het gereedschap zegt dat dit het tijdsverschil registreert tussen het begin van opeenvolgende systeemaanroepen.

Voorbeeld:

strace -r ls

Hieronder volgt de uitvoer die dit commando geeft:

Hoe strace een tijdstempel te laten afdrukken voor elke systeemaanroep

Je ziet dus dat aan het begin van elke regel een relatieve tijdstempel werd geproduceerd.

Q5. Hoe voorvoeg je elke uitvoerregel met kloktijd?

Wil je dat elke regel in de uitvoer van strace begint met de kloktijd, dan kan dat met de -t commandoregel optie.

Bijvoorbeeld:

strace -t ls

Hier is de uitvoer van dit commando op mijn systeem:

Strace tijd prefix

Zo kun je zien dat de systeemtijd aan het begin van elke regel afgedrukt werd.

Merk op dat er nog twee verwante opties zijn die strace biedt:

-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. Hoe kun je strace de tijd laten tonen die besteed wordt aan systeemaanroepen?

Dit kan met de -T command-line optie.

Bijvoorbeeld:

strace -T ls

Hieronder volgt de uitvoer:

Toon functie-aanroep timings met strace

Zo zie je dat de tijd besteed aan systeemaanroepen aan het eind van elke regel wordt afgedrukt.

Q7. Hoe kun je strace een samenvatting laten afdrukken in plaats van de gebruikelijke uitvoer?

De -c commandoregel uitvoer kun je gebruiken als je wilt dat het gereedschap een samenvatting geeft.

Bijvoorbeeld, het volgende commando:

strace -c ls

produceerde deze uitvoer op mijn systeem:

% 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

Zo zie je dat de samenvatting je een idee geeft over hoeveel aanroepen er per syscall gedaan werden, en ook tijdgerelateerde informatie voor elke syscall.

Conclusie

We hebben hier nog maar aan de oppervlakte gekrast, want het strace commando biedt nog veel meer mogelijkheden. Als je klaar bent met oefenen wat we hier besproken hebben, ga dan naar de strace man pagina om meer over het hulpmiddel te leren.