L'opera di debugging di un processo non è generalmente argomento proponibile ad un sistemista non esperto, anche perchè spesso riguardano problemi sul lato applicativo che vanno affrontati direttamente dallo sviluppatore.
In ogni caso, nella vita di ogni sysadm capita sistematicamente che dei servizi non partano o dei programmi non facciano quello che dovrebbero fare (non inchiodarsi, innanzitutto), oppure, più subdolamente, abbiano comportamenti erratici o problemi di prestazioni o di sopportazione di alti carichi.
Senza volersi addentrare in problematiche di debugging avanzato, si possono elencare alcuni strumenti a disposizione del sistemista per diagnosticare simili problemi:
Log
I log sono sempre la prima cosa da guardare perchè di solito contengono abbastanza informazioni da farci capire dove intervenire. Eventualmente analizzare syslog.conf
o le istruzioni e le configurazioni del singolo programma per capire dove vengono loggati i suoi messaggi e poi leggere i messaggi di errore sui log che ci interessano.
Debug
Quasi sempre è possibile lanciare un programma con diversi livelli di debug: aumentando la verbosità del debug (di solito registrato sul file di log) si aumenta la possibilità di capire cosa non funziona. Tipicamente il livello di debug può essere impostato come opzione da command line o nel file di configurazione.
Comandi di diagnostica
Unix mette a disposizione vari comandi utili per capire cosa fa un processo e come si comporta il sistema. SU Linux si possono comunemente trovare i seguenti tool:
strace
Traccia le chiamate di sistema e i segnali del programma specificato mentre lo esegue. Ovviamente va utilizzato solo per fini diagnostici, rallentando particolarmente la velocità di esecuzione. Spesso non è nemmeno necessario capire l'output di strace (invero piuttosto verboso e per molti incomprensibile), basta cercare righe dove si parla di errori e vengono indicati path o funzioni specifiche. Spesso un programma non funziona perchè non trova certi file (librerie ecc) o non ha i permessi adeguati sugli stessi, un grep ENOENT
sullo stdout di strace può evidenziare tutte le volte in cui si è cercato un file senza trovarlo (spesso questo non è un problema, in quanto un processo può trovare un file dopo averlo cercato senza successo in varie directory (con relativo messaggio di errore "ENOENT (No such file or directory)".
ldd
Stampa l'elenco delle librerie condivise utilizzate dal comando specificato
lsof
Elenca gli open file del sistema. Un open file può essere: un normale file, una directory, un file speciale a blocchi o caratteri, una librerira, una socket Internet, una socket Unix domain... E' utile per vedere le risorse utilizzate da un programma (e, per esempio, capire dove sta loggando).
ldd (List Dynamic Dependencies) permette di determinare quali librerie condivise vengono utilizzate da un file eseguibile. All'output viene stampato l'elenco delle librerie necessarie al file e il loro percorso.
ldd [opzione] nome_file
-v
"verbose", opzione che stampa tutte le informazioni riguardanti le librerie utilizzate dal file.
Vediamo un esempio. Eseguendo il comando ldd /bin/ls
, verrà visualizzato l'elenco delle librerie che vengono utilizzate dal comando ls
.
libtermcap.so.2 => /lib/libtermcap.so.2 (0x4001e000)
libc.so.6 => /lib/libc.so.6 (0x40022000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
Questo vuol dire che il comando ls dipende dalla presenza di libtermcap.so.2 (libreria che descrive le capacità di un terminale) e da libc.so.6 (la libreria C).
Se un programma non dipende da alcuna libreria, ldd stamperà la stringa statically linked (ELF) oppure statically linked.
lsof (List Open Files) elenca gli "open file" del sistema, cioè normali file, file speciali a blocchi o caratteri, directory, librerie condivise, processi, socket, etc.
lsof [opzioni]
Eseguendo lsof
senza opzioni si genera l'elenco completo dei file aperti sul sistema, che generalmente è piuttosto lungo.
Le opzioni più interessanti sono:
-p [numero]
stampa gli open file in base al pid specificato
-i
stampa solo i processi Internet. Molto utile per esaminare le porte aperte che aspettano tentativi di connessione (e quindi anche potenziali intrusi).
lsof è un tool molto utile utilizzato in combinazione col comando grep
.
Ad esempio, eseguendo lsof | grep sshd
si visualizzano sia file aperti da sshd che la porta su cui sta "ascoltando" (LISTEN) o eventuali connessioni aperte.
strace è un tool molto utile per il debugging, eseguendo un "Signal Trace" ("Tracciamento dei Segnali", ndt). Il suo utilizzo permette di eseguire un programma tenendo sotto controllo tutti i segnali e le chiamate di sistema. In questo modo si possono ricercare eventuali errori e capire dove il programma non funziona. Strace è anche in grado di "attaccarsi" a un processo già in esecuzione e tracciarne i segnali.
strace [opzioni]
-o [file_output] [nome_comando]
esegue uno strace di un programma registrando l'output in un file, permettendo cosi una comoda analisi a posteriori
-p PID
collega strace ad un processo già in corso inserendo il PID
Vediamo un esempio. strace -o debug.txt netstat scrive su debug.txt l'output del tracing di netstat. Attenzione! Strace produce una grande quantità di output e rallenta notevolmente la macchina: la chiamata appena effettuata produce 235 righe di output in meno di 2 secondi, ma si può arrivare tranquillamente anche oltre 5000. Per questo è sempre utile stampare l'output in un file.
Spesso un programma non funziona perchè non trova certi file o librerie o non ha i permessi adeguati sugli stessi. Per rimediare basta fare | grep ENOENT: indica che non è riuscito a trovare un file o una directory.
Windows XP (e .NET server), come i suoi predecessori, presenta una varietà interessante di command line tools utili per diagnosticare e visualizzare informazioni sui processi correnti senza ricorrere a finestre.
Alcuni sono disponibili su una installazione standard, altri vengono forniti dai Windows Support Tools installabili dal disco di Windows XP (x:\SUPPORT\TOOLS\SUPTOOLS.MSI).
Questi comandi si rivelanto piuttosto utili per l'amministrazione remota via telnet in command line (per quanto poco diffusa nel mondo Windows) o per script di amministrazione, monitoring e task schedulati.
TASKLIST.exe - Presente di default
Visualizza i processi correnti e numerose informazioni su risorse utilizzate, thread, librerie, servizi.
TASKLIST /?
Mostra le istruzioni e le opzioni disponibili da command line.
TASKLIST /M olepro32.dll
Visualizza tutti i processi che utilizzano il modulo specificato. Se si lasci l'opzione /M senza dettagli, visualizza l'elenco completo dei processi con tutte le dll utilizzate.
TASKLIST /SVC
Elenco dei processi e dei relativi servizi che da loro vengono gestiti. Tipicamente una o pi istanze di svchost.exe gestiscono tutti i servizi comuni di Windows.
TASKLIST /V /FO csv
Visualizza verbose informazioni (CPU time, memoria, user) sui processi. L'opzione /FO permette di specificare il formato dell'output (table,list o csv) e può essere utile per esportare i dati raccolti su semplici file di testo (es: TASKLIST /V /FO csv > processi.csv
scrive sul file proscessi.csv l'elenco con campi separati da virgola, di tutti i processi in memoria con relativi parametri.
TASKLIST /S system /U username /P password /NH /FO table
Visualizza le informazioni di un sistema remoto, dal nome indicato e collegandosi con nome utente e password specificate. L'opzione /NH evita la visualizzazione degli header che descrivono il significato delle colonne (non necessari per operazioni di info gathering e monitoring).
PMON.exe - Installabile con i Windows Support Tools
Corrisponde al top dei sistemi Unix. Mostra una schermata aggiornata regolarmente con informazioni come la memoria, la cpu, il numero di thread, la priority dei processi in esecuzione.
La logica e il funzionamento sono gli stessi di top, le informazioni fornite sono adattate ad un sistema Windows.
PSTAT.exe - Installabile con i Windows Support Tools
Non prevede opzioni, basta eseguirlo per visualizzare un lungo elenco di tutti i processi con tutti i relativi thread. Per ogni thread viene indicato lo stato, il numero di context switch, la cpu utilizzata e altre informazioni.
pstat > pstat.txt
Redirige l'output di pstat su un file di testo per una comoda consultazione successiva
PFMON.exe - Installabile con i Windows Support Tools
Permette di monitorare tutte le paginazioni di un processo. Indica chiaramente le SOFT e le HARD page fault, utile per diagnosticare rallentamenti del sistema dovuti ad hard page fault.
pfmon /p 2189
Visualizza tutti i page fault del processo con PID 2189.
pfmon /p 2189 /d
Visualizza informazioni aggiuntive quali program counter, simboli e indirizzo di memoria virtuale del processo specificato.
Sono disponibili varie opzioni per limitare il tipo di page fault da visualizzare (per esempio -h per vedere solo gli hard fault).
ATTENZIONE: Quando si esegue pfmon su un processo corrente e lo si interrompe chiudendo la finestra del prompt dei comandi, il processo monitorato viene killato brutalmente, senza possibilità di salvataggio dei dati.
MEMSNAP.exe - Installabile con i Windows Support Tools
Scrive su un file di log (di default memsnap.log, nella directory corrente) informazioni relative alla memoria, utilizzata e paginata dai processi. Utile per individuare memory leaks.
memsnap /t /g
Aggiunge informazioni sul sistema, la data ecc. Le opzioni possono essere omesse.
TYPEPERF.exe - Presente di default
E' l'equivalente in command line del Performance monitor (perfmon.exe). Può essere utilizzato per visualizzare gli innumerevoli parametri sulle performance del sistema (anche remoto).
Ogni tipo di performance counter ha un PATH, che ha sintassi: [\\Computer]\object[parent/instance#index]\counter]
Sono disponibili numerose opzioni che ne aumentano la flessibilità e la possibilità di utilizzo in diversi contesti:
-c Specifica il PATH da monitorare
-q Visualizza l'elenco dei PATH di tutti i parametri monitorabili.
-q Visualizza l'elenco dei PATH di tutti i parametri monitorabili, incluse le singole istanze.
-cf nomefile Indica un file da cui ottenere, one per riga, l'elenco dei PATH da monitorare
-f Specifica il formato di output da utilizzare (csv|tsv|bin)
-si secondi Specifica ogni quanti secondi eseguire il controllo
-o nomefile Specifica il file su cui salvare i dati. Di default è lo standard output.
-sc numero Indica il numero di campioni da ottenere. Di default è infinito (si interrompe con CTRL+C)
Lsof è un comando utile per il debugging dei processi, può essere utilizzato anche per vericare la corrispondenza nome, PID processo e porte aperte sul proprio sistema.
L'opzione -i abilita la visualizzazione della corrispondenza processo, servizio e numero porta, invece le opzioni -n e -P evitano la risoluzione dell'host e port name.
[root@GIOVE root]# lsof -i -P -n
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 470 root 3u IPv4 1032 TCP *:22 (LISTEN)
xinetd 481 root 5u IPv4 1112 TCP *:23 (LISTEN)
mysqld 525 mysql 3u IPv4 1113 TCP *:3306 (LISTEN)
mysqld 527 mysql 3u IPv4 1113 TCP *:3306 (LISTEN)
mysqld 528 mysql 3u IPv4 1113 TCP *:3306 (LISTEN)
sshd 529 root 4u IPv4 1119 TCP 10.0.0.16:22->10.0.0.93:33942 (ESTABLISHED)