Note sul tracciamento dei programmi

Autore: Matteo Lucarelli
ultima versione su: matteolucarelli.altervista.org
Documento in costruzione

Il presente documento vuole essere un breve prontuario degli usi delle utility strace e ltrace. Illustra quindi solo alcune delle possibilità, ed in particolare solo i parametri di uso più comune nell'ausilio al debugging.

Generalità

Il comando strace permette di rilevare e tracciare tutte le chiamata al sistema effettuate da un programma in esecuzione. Intercetta inoltre i segnali (SIGINT,SIGRMR,ecc.). Il comando ltrace permette di rilevare e tracciare tutte le chiamate a librerie dinamiche. L'uso dei due programmi è miolto simile ed i flag a disposizione sono quasi gli stessi.

I comandi di tracciamento vanno sempre lanciati con argomento. L'argomento può essere un comando, nel qual caso il comando passato viene eseguito da strace, oppure il PID (process ID) di un processo già in esecuzione. Nel secondo caso il termine del tracciamento non causerà il termine del programma tracciato.

L'output presenta una chiamata per ogni linea associata al suo valore di ritorno:

open("/dev/null", O_RDONLY) = 3
In questo modo è possibile individuare immediatamente degli errori, ad esempio di apertura file:
open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)

Invocazione

Per eseguire e tracciare un programma:

strace hello_word
ltrace hello_word

Per agganciare il tracciamento ad un programma in esecuzione (ad esempio con PID=1234):

strace -p1234

Le informazioni di tracciamento sono estremamente verbose, è quindi uso comune redirezionare l'output in un file:

strace -o file_di_output programma
Si noti che non è possibile utilizzare la redirezione "classica" perchè tutto ciò che segue i flag viene cosiderato comando da eseguire (quindi la redirezione avrebbe effetto sul comando lanciato).

Filtraggio

Il flag -e permette di filtrare quali chiamate tracciare. Per tracciare solo le chiamate alle syscall open e close (la seconda è la forma abbreviata):

strace -e trace=open,close programma
strace -eopen,close programma
Per tracciare tutte le chiamate che coinvolgono file (open, access, stat, ecc.):
strace -e trace=file programma
strace -efile programma
Per tracciare tutte le chiamate che coinvolgono i processi (fork, exec, ecc.):
strace -e trace=process programma
strace -eprocess programma
Per tracciare solo i segnali:
strace -e trace=signal programma
strace -esignal programma

Naturalmente ltrace permette di limitare il tracciamento alle chiamate relative ad una specifica libreria:

ltrace -l /lib/tls/libpthread.so.0 programma
Per ottenere il path completo della libreria dinamica utlizzata è comodi utilizzare il comando ldd (che appunto stampa l'elenco delle librerie dinamiche utlizzate da un certo eseguibile).

Altri flag

L'invocazione tramite il flag -c produce un altro tipo di output:

strace -c sleep 1
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 27.72    0.000079           6        14           old_mmap
 23.16    0.000066           9         7         1 open
  9.82    0.000028           6         5         5 access
  8.77    0.000025           6         4           read
  7.02    0.000020           3         6           fstat64
  5.96    0.000017           3         6           close
  3.86    0.000011           3         4           brk
  3.51    0.000010          10         1           mmap2
  2.46    0.000007           7         1           munmap
  1.40    0.000004           4         1           uname
  1.40    0.000004           4         1           clock_gettime
  1.05    0.000003           3         1           rt_sigaction
  1.05    0.000003           3         1           set_thread_area
  0.70    0.000002           2         1           nanosleep
  0.70    0.000002           2         1           rt_sigprocmask
  0.70    0.000002           2         1           getrlimit
  0.70    0.000002           2         1           set_tid_address
------ ----------- ----------- --------- --------- ----------------
100.00    0.000285                    56         6 total
In tabella vengono elencate tutte le chiamate effettuate ed i relativi tempi di esecuzione ed eventuali errori generati.

Il flag -f aggiunge al tracciamento anche tutti i processi figli generati dal processo in esame.

matteolucarelli.altervista.org
©opyright info