Chiunque abbia a che fare con la pro­gram­ma­zio­ne incontra ine­vi­ta­bil­men­te il termine “debugging”. Questo processo indica un’indagine a tutto tondo del codice sorgente di un programma in­for­ma­ti­co che mira a rilevare gli errori in esso contenuti. Quando l’obiettivo primario è che il software funzioni cor­ret­ta­men­te su tutte le piat­ta­for­me e sui di­spo­si­ti­vi target de­si­de­ra­ti, non è possibile ri­nun­cia­re all’uso di un debugger. In questo articolo sco­pri­re­te esat­ta­men­te cos’è un debugger, come funziona e in quali contesti si utilizza.

Che cos’è un debugger?

Un debugger è un programma per computer che consente di rilevare e dia­gno­sti­ca­re errori nel software. Lo scopo di tale strumento è quello di garantire la fun­zio­na­li­tà del software testato su tutti i di­spo­si­ti­vi e le piat­ta­for­me target nel lungo termine. Per questo motivo, molti debugger con­trol­la­no non solo il ri­spet­ti­vo codice sorgente, ma anche l’in­te­ra­zio­ne con il sistema operativo uti­liz­za­to e l’hardware sot­to­stan­te. Il processo di debug avviene di­ret­ta­men­te durante il runtime, in modo che il software esaminato non debba essere terminato per ef­fet­tua­re la verifica.

N.B.

Il termine “debug” si riferisce al processo con cui vengono rilevati gli errori nel programma e spesso si utilizza anche quando a tale scopo si ricorre a un metodo di verifica degli errori basato su strumenti diversi dal debugger.

Il termine “debug” è composto dal prefisso inglese de - (in italiano “de-”) e dalla parola inglese bug (“insetto”) e si riferisce a un processo uti­liz­za­to nello sviluppo di software da decenni per indicare errori di programma di vario tipo. Tra gli ingegneri era già in uso nel XIX secolo come termine per indicare i mal­fun­zio­na­men­ti. Sulla base di questo termine, la cor­re­zio­ne di un errore software è anche indicata come “bugfix”.

De­fi­ni­zio­ne

Debugger: si tratta di programmi per computer che con­sen­to­no agli svi­lup­pa­to­ri di in­di­vi­dua­re gli errori rilevati in un software. Questi errori, chiamati bug, possono quindi essere fa­cil­men­te corretti ga­ran­ten­do la fun­zio­na­li­tà a lungo termine del software.

Quali sono le funzioni di un debugger?

Non esiste un software perfetto privo di errori, il che rende vir­tual­men­te in­di­spen­sa­bi­le l’ot­ti­miz­za­zio­ne quo­ti­dia­na. Il problema prin­ci­pa­le spesso non è quello di rilevare i processi difettosi nel codice del programma, ma piuttosto de­ter­mi­nar­ne l’esatta causa. È suf­fi­cien­te una parentesi po­si­zio­na­ta in modo errato o un operatore non uti­liz­za­to cor­ret­ta­men­te per impedire il giusto fun­zio­na­men­to di un software. Con centinaia o ad­di­rit­tu­ra migliaia di righe di codice, la ricerca manuale, ef­fet­tua­ta carattere per carattere, non potrebbe garantire la ri­so­lu­zio­ne certa del problema. Per questo motivo, i debugger moderni non si limitano a in­di­vi­dua­re un problema, ma for­ni­sco­no anche in­for­ma­zio­ni det­ta­glia­te sul tipo di errore e spesso anche sulla riga di codice in­te­res­sa­ta.

I debugger ana­liz­za­no il codice del programma passo per passo. A tal fine si in­se­ri­sco­no dei co­sid­det­ti brea­k­point (punti di in­ter­ru­zio­ne) nei punti del software da sot­to­por­re a debug. Lo strumento di debug riconosce questi punti e può uti­liz­zar­li per arrestare l’ese­cu­zio­ne del software. Gli svi­lup­pa­to­ri hanno allora due opzioni:

  • esaminare lo stato esatto del programma in questo momento, ad esempio, per ve­ri­fi­ca­re se tutte le variabili coinvolte hanno prodotto i valori previsti
  • ri­pro­dur­re il programma dal ri­spet­ti­vo brea­k­point per limitare eventuali problemi o fonti di errori

I brea­k­point non devono ne­ces­sa­ria­men­te essere fissi: molti debugger con­sen­to­no di collegare i brea­k­point a spe­ci­fi­che con­di­zio­ni. Questo permette, ad esempio, di in­ter­rom­pe­re l’ese­cu­zio­ne di un programma quando si ve­ri­fi­ca­no de­ter­mi­na­te con­di­zio­ni. Ad esempio, se un ciclo viene eseguito cor­ret­ta­men­te per 20 volte e solo alla 21° si verifica un errore, il debugger rileva di­ret­ta­men­te il problema grazie a una con­di­zio­ne cor­ri­spon­den­te. I cicli pre­ce­den­ti, che non hanno evi­den­zia­to mal­fun­zio­na­men­ti, non devono quindi essere ripetuti.

Ulteriori funzioni dei debugger includono, tra l’altro, l’analisi di dati come i contenuti di variabili, memorie o registri e la modifica di memorie come la memoria prin­ci­pa­le (memoria centrale) e il registro del pro­ces­so­re.

Come si usano i debugger?

Il modo esatto in cui un debugger può essere uti­liz­za­to per l’in­di­vi­dua­zio­ne degli errori di un software dipende, da un lato, dallo strumento stesso e, dall’altro, dal sistema operativo su cui si esegue il software (e il debugger). L’utente fornisce allo strumento di verifica le in­for­ma­zio­ni sul processo a cui col­le­gar­si tramite un ID processo o un nome. In quest’ultimo caso, il debugger individua in­nan­zi­tut­to l’ID processo associato. La sessione di debug si avvia quindi mediante una chiamata di sistema.

In generale, si possono di­stin­gue­re due diversi approcci all’uso degli strumenti di debug:

  • Il processo di verifica si effettua all’interno del sistema su cui gira il software da con­trol­la­re.
     
  • Il processo di verifica non si avvia nel computer sul quale viene eseguito il software da con­trol­la­re, ma su un sistema remoto, metodo definito anche debug remoto.

I debugger moderni sono spesso in grado di tenere conto delle modifiche al codice sorgente di un software nel controllo degli errori anche durante l’ese­cu­zio­ne. Questo debug Just-In-Time è par­ti­co­lar­men­te utile nella fase iniziale di sviluppo del software in­for­ma­ti­co, dove errori di codice minori, ma anche maggiori, non sono rari. Non è un caso che anche gli ambienti di sviluppo di molti linguaggi di scripting e framework di­spon­ga­no di un debugger integrato.

Debugger: ambiti di ap­pli­ca­zio­ne

Quando si tratta di debugger o debugging in generale, è assodato che se si desidera che un codice in­for­ma­ti­co funzioni nel lungo termine senza pre­sen­ta­re errori, l’uso di questa procedura di verifica è in­di­spen­sa­bi­le, sia che si desideri pro­gram­ma­re, svi­lup­pa­re ul­te­rior­men­te o testare uno script semplice, un singolo processo, un modulo, un programma complesso o un sistema operativo intero.

Un software con un debugger integrato può essere molto utile anche per i pro­gram­ma­to­ri non pro­fes­sio­ni­sti: pro­get­ta­to e con­fi­gu­ra­to in maniera corretta, il debugger può fungere, ad esempio, da filo diretto tra l’utente del programma e lo svi­lup­pa­to­re quando si ve­ri­fi­ca­no errori durante l’uso. I report del debugger con­sen­to­no agli svi­lup­pa­to­ri di com­pren­de­re meglio il problema e come l’utente può ri­sol­ver­lo. A seconda del programma, del debugger e della gravità dell’errore, questo strumento può anche con­sen­ti­re agli utenti di cor­reg­ge­re l’errore au­to­no­ma­men­te.

Vai al menu prin­ci­pa­le