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.
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) = 3In questo modo è possibile individuare immediatamente degli errori, ad esempio di apertura file:
open("/foo/bar", O_RDONLY) = -1 ENOENT (No such file or directory)
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 programmaSi 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).
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 programmaPer tracciare tutte le chiamate che coinvolgono file (open, access, stat, ecc.):
strace -e trace=file programma strace -efile programmaPer tracciare tutte le chiamate che coinvolgono i processi (fork, exec, ecc.):
strace -e trace=process programma strace -eprocess programmaPer 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 programmaPer 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).
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 totalIn 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.