Cos'è il debugging?

Agente assicurativo felice che ha concluso positivamente un accordo con una coppia durante un incontro in ufficio

Autori

Camilo Quiroz-Vázquez

IBM Staff Writer

Cos'è il debugging?

Il debug è il processo di individuazione, isolamento e risoluzione degli errori di programmazione, noti come bug, nei programmi software. Il debug aiuta a scoprire la causa degli errori di codifica, a prevenire i problemi di funzionamento del software e a migliorare le prestazioni complessive del software.

Errori di codifica come errori logici, errori di runtime, errori di sintassi ed errori semantici possono causare arresti anomali, output errati o imprecisi, vulnerabilità di sicurezza e perdita di dati. A differenza dei test del software, che consentono agli sviluppatori di studiare gli effetti di questi errori nel codice sorgente di un programma, il debugging cerca la causa principale e la correzione di questi errori.

Attraverso il processo di debug, gli sviluppatori di software effettuano un'analisi delle cause principali per assicurarsi che i bug rilevati nei programmi per computer siano corretti e non si ripetano. I bug possono avere un impatto negativo sulla stabilità, sull'affidabilità e sull'esperienza utente del software. Gli strumenti e le strategie di debug consentono di ottimizzare il processo di debug.

Veduta aerea di uno snodo di autostrade

Rimani con la testa nel cloud 


Ricevi la newsletter settimanale Think per una guida esperta sull'ottimizzazione delle impostazioni multicloud nell'era dell'AI.

Processo di debug

Il debugging prevede in genere sei passaggi:

- Riprodurre le condizioni
- Trovare il bug
- Determinare la causa principale
- Correggere il bug
- Test per convalidare la correzione
- Documentare il processo

Passaggio 1: riprodurre le condizioni

Il processo di debug richiede specificità; gli ingegneri non possono fare affidamento su una descrizione di seconda mano del problema per diagnosticarlo con precisione. Pertanto, il primo passo del processo di debug è replicare le condizioni che hanno causato la comparsa del bug. La riproduzione del bug consente ai programmatori e agli ingegneri di osservare l'errore in prima persona e raccogliere dati contestuali per il resto del processo di debug.

Passaggio 2: trovare il bug

Il passaggio successivo consiste nell'individuare l'origine del bug nel modo più accurato possibile esaminando attentamente il codice e rivedendo tutti i log disponibili. Durante questo passaggio, gli sviluppatori si affidano in genere a strumenti di debug che semplificano la ricerca di grandi parti di codice, anziché lavorare manualmente.

Passaggio 3: determinare la causa principale

Gli sviluppatori determinano la causa di un bug esaminando la logica e il flusso del codice e il modo in cui i diversi componenti del codice interagiscono nelle condizioni specifiche in cui si verifica il bug.

Passaggio 4: correggere il bug

Questo passaggio comporta in genere la risoluzione dei problemi e la revisione del codice per correggere il problema e la ricompilazione e la riesecuzione del software per assicurarsi che il bug sia stato corretto. Queste revisioni possono comportare diverse iterazioni, poiché i primi tentativi possono non riuscire o introdurre inavvertitamente nuovi bug.

La maggior parte degli sviluppatori utilizza un sistema di controllo della versione per tenere traccia delle modifiche, in modo da poter ripristinare facilmente tutte le modifiche che non risolvono il problema o crearne di nuove.

Passaggio 5: test per convalidare la correzione

I test eseguiti dopo una correzione di bug includono:

  • Test unitari, che testano il singolo segmento di codice modificato per correggere il bug
  • Test di integrazione, che testano l'intero modulo contenente il bug corretto
  • Test di sistema, che testano l'intero sistema in cui viene eseguito il modulo modificato
  • Test di regressione, che assicurano che il codice corretto non influisca sulle prestazioni dell'applicazione, ovvero che l'applicazione non sia regredita a causa della correzione di bug.

Passaggio 6: documentare il processo

Come passaggio finale, gli sviluppatori registrano i dettagli del processo di riparazione, incluso ciò che ha causato il bug, come è stato risolto e qualsiasi altra informazione pertinente. La documentazione è uno strumento prezioso a cui i programmatori possono fare riferimento quando in futuro si verificheranno bug simili.

Sviluppo di applicazioni

Sali a bordo: sviluppo di applicazioni Enterprise nel cloud

In questo video il Dr. Peter Haumer illustra l'aspetto del moderno sviluppo di applicazioni aziendali nell'hybrid cloud, mostrando diversi componenti e pratiche, tra cui IBM Z Open Editor, IBM Wazi e Zowe. 

Esempi di debugging

Comprendere i tipi di bug che un sistema deve affrontare consente agli ingegneri e agli sviluppatori del software di trovare il modo appropriato per correggere il codice danneggiato quando si verifica un errore. Esempi di errori comuni che richiedono il debug includono:

Errori semantici

Un pezzo di codice che viola le regole di un linguaggio di codifica causa un errore semantico. A differenza di un errore logico, che produce un output errato, un errore semantico non produrrà un output significativo.

Errori di sintassi

Questo errore si verifica quando uno sviluppatore trascura un elemento del codice, come una parentesi, una virgola o un altro errore tipografico. A differenza delle lingue umane scritte, dove una frase con un errore tipografico potrebbe ancora essere compresa, i pezzi di codice mancanti causano immediatamente errori.

Errori logici

Questo tipo di bug include una sintassi tecnicamente corretta, ma con indicazioni errate che causano un output indesiderato. Poiché la sintassi è corretta, questi errori possono essere difficili da rilevare. Quando un sistema non si blocca immediatamente e la ricerca della posizione esatta del codice errato può richiedere molto tempo.

Errori di runtime

Questi errori si verificano quando un'applicazione è in esecuzione o in fase di avvio. Gli errori di runtime possono occasionalmente essere corretti aggiornando, riavviando o reinstallando un'applicazione. Altre volte possono essere un segnale di un programma che richiede più memoria o di un altro tipo di errore come un errore logico.

Tipi di debugging

Il processo di debug può essere impegnativo e laborioso. La comprensione dei vari approcci al processo di debug può rendere più efficace la gestione dell'attività.

Backtracking

In questo approccio, gli sviluppatori lavorano a ritroso dal punto in cui è stato rilevato l'errore per trovare l'origine del bug. In particolare, ripercorrono i passi compiuti dal programma con il codice sorgente problematico per vedere dove le cose sono andate storte. Il backtracking può essere efficace se utilizzato insieme a un debugger.

Eliminazione della causa

Una tecnica di debug basata su ipotesi per l'eliminazione delle cause richiede che il team speculi sulle cause dell'errore e verifichi ogni possibilità in modo indipendente. Questo approccio funziona meglio quando il team ha familiarità con il codice e le circostanze relative al bug.

Suddividere il problema per risolverlo

Durante il debug di basi di codice di grandi dimensioni, i team possono dividere le righe di codice in segmenti (funzioni, moduli, metodi di classe o altre divisioni logiche verificabili) e testarle separatamente per individuare l'errore. Quando il segmento problematico viene identificato, può essere ulteriormente suddiviso e testato fino a identificare l'origine del bug.

Stampa e log di debug

La strategia di debug "print and log" prevede l'aggiunta di istruzioni di stampa, o «log», al codice per visualizzare i valori delle variabili, gli stack di chiamate, il flusso di esecuzione e altre informazioni pertinenti. Questo approccio è particolarmente utile per il debug di sistemi concorrenti o distribuiti in cui l'ordine di esecuzione può influire sul comportamento del programma.

Rubber duck debugging

In questo approccio, gli sviluppatori "spiegano o parlano" del codice, riga per riga, a un qualsiasi oggetto inanimato. L'idea è che, cercando di spiegare il codice ad alta voce, gli sviluppatori possono capire meglio la sua logica (o la sua mancanza) e individuare più facilmente i bug.

Debug automatico

Il debug automatico si basa su analytics, intelligenza artificiale (AI)algoritmi di machine learning per automatizzare uno o più passaggi del processo di debug. Gli strumenti di debug basati sull'AI possono analizzare più rapidamente grandi quantità di codice per identificare errori o restringere sezioni di codice che possono poi essere esaminate più approfonditamente da uno sviluppatore.

I sistemi automatizzati possono replicare righe di codice e automatizzare i test per verificare che un sistema funzioni come previsto. L'automazione gioca un ruolo importante sia nell' integrazione continua (CI) che nella distribuzione continua (CD), due approcci che accelerano il test e l'implementazione del nuovo codice.

Brute force debugging

Tipicamente utilizzato quando altri metodi falliscono, il brute force debugging consiste nell'esaminare l'intera base di codice, riga per riga, per identificare l'origine del problema. Questo approccio, che richiede molto tempo, può essere utile anche per il debug di programmi di piccole dimensioni, quando l'ingegnere o il programmatore che esegue il debug non ha familiarità con la base di codice.

Strumenti di debugging

I debugger sono strumenti e API avanzati che ottimizzano lo sviluppo del software individuando gli errori di codifica in un sistema operativo o nel processo di sviluppo di un'applicazione. I debugger rappresentano un business enorme e in crescita. Con il landscape in continua espansione delle applicazioni e dei programmi per computer e dispositivi mobili, non sorprende che il mercato globale dei debugger sia destinato a crescere in modo significativo entro la fine del decennio1.

Le aziende stanno investendo milioni nello sviluppo di sofisticati strumenti di debug (come i chatbot AI in grado di eseguire il debug del codice2 e i ricercatori universitari stanno creando strumenti in grado di eseguire il debug dei videogiochi in modo autonomo 3 e il debug dei linguaggi di programmazione specifici del settore 4.

Gli strumenti e le tecnologie possono variare notevolmente a livello di funzionalità, ma essenzialmente offrono tutti interfacce a riga di comando che aiutano le organizzazioni a trovare e risolvere i problemi di bug. La maggior parte offre anche funzionalità di debug remoto e tutorial che rendono il software più accessibile ai principianti.

Esempi di strumenti di debugging:

Ambienti di sviluppo integrati (IDEs)

Gli IDE offrono ai programmatori di computer funzionalità complete per lo sviluppo di software. Molti IDE come Visual Studio, Eclipse e PyCharm sono dotati di una "modalità di debug". Questi strumenti di debug integrati consentono agli sviluppatori di eseguire il codice riga per riga (step debugging), interrompere l'esecuzione del programma in punti specifici (breakpoint) ed esaminare lo stato delle variabili e della memoria in qualsiasi momento (oltre ad altre funzionalità).

Gli IDE sono disponibili anche come plug-in open source compatibili con una gamma di linguaggi di programmazione come Java, Python, JavaScript e TypeScript e linguaggi di scripting come PHP.

Debugger autonomi

I debugger autonomi come GNU Debugger (GDB) offrono funzionalità di debug avanzate, tra cui breakpoint condizionali e watchpoint. Inoltre, facilitano il debug inverso, ovvero quando i programmatori eseguono un programma al contrario. Tendono ad essere più potenti e versatili dei debugger integrati negli IDE o in altri strumenti per sviluppatori, ma hanno anche una curva di apprendimento più ripida per gli utenti e richiedono maggiori competenze tecniche.

Utilità di registrazione

Questi strumenti consentono di registrare lo stato di un programma in vari punti del codice. I log possono quindi essere analizzati per trovare anomalie o modelli problematici. Il logging è utile per risolvere i problemi di bug che si verificano negli ambienti di produzione, dove il debug interattivo potrebbe non essere fattibile.

Analizzatori statici di codice

Gli strumenti di analisi statica analizzano il codice senza eseguirlo, cercando potenziali errori e correggendo bug e deviazioni dagli standard di codifica. Invece di concentrarsi sulla sintassi (come fanno gli interpreti e i compilatori), questi strumenti analizzano la semantica del codice sorgente, aiutando gli sviluppatori a rilevare errori di programmazione comuni e ad applicare stili di codifica coerenti.

Strumenti di analisi dinamica

Essenzialmente l'opposto degli analizzatori di codice statici, gli strumenti di analisi dinamica monitorano il software durante l'esecuzione per rilevare problemi quali perdite di risorse o problemi di concorrenza. Questo strumento aiuta i team di sviluppo a individuare i bug che l'analisi statica potrebbe ignorare, come le perdite di memoria o i buffer overflow.

Profiler delle prestazioni

I profiler delle prestazioni consentono agli sviluppatori di identificare i colli di bottiglia delle prestazioni nel loro codice. Questi sistemi possono misurare l'utilizzo della CPU, l'utilizzo della memoria e le operazioni di I/O, aiutando a individuare le operazioni lente e inefficienti.

Debug e test

I test e il debug sono processi complementari nello sviluppo di nuovo codice. Sebbene i risultati differiscano, sia i test che il debug vengono utilizzati per produrre codici privi di errori.

I test consentono agli sviluppatori di software di capire cosa succede a un sistema quando si verificano dei bug. Questi test aiutano gli sviluppatori a sapere quando nel sistema si è verificato un errore e gli effetti che tale errore potrebbe avere su un software. I test automatizzati consentono agli sviluppatori di eseguire test continui sul nuovo codice per ottenere informazioni su vari scenari. Il test è una parte fondamentale dello sviluppo del software, ma non spiega perché si è verificato un errore.

Le strategie e gli strumenti di debug sono ciò che gli sviluppatori utilizzano per trovare la causa principale degli errori, correggerli e documentarli per evitare che si ripetano. Se utilizzati insieme, il debug e i test aiutano i team a creare un approccio semplificato allo sviluppo del codice e alla creazione di prodotti software migliori.

Soluzioni correlate
IBM Enterprise Application Service for Java

Un servizio single-tenant completamente gestito per lo sviluppo e la distribuzione di applicazioni Java.

Esplora le applicazioni Java
Soluzioni DevOps

Utilizza il software e gli strumenti DevOps per creare, distribuire e gestire app cloud-native su più dispositivi e ambienti.

Esplora le soluzioni DevOps
Enterprise Application Development Services

Lo sviluppo di applicazioni cloud significa programmare una volta, iterare rapidamente e distribuire ovunque.

Servizi per lo sviluppo di applicazioni
Fai il passo successivo

I servizi di consulenza per lo sviluppo delle applicazioni IBM Cloud offrono consulenza esperta e soluzioni innovative per semplificare la tua strategia cloud. Collabora con gli esperti di cloud e sviluppo di IBM per modernizzare, scalare e accelerare le tue applicazioni, ottenendo risultati trasformativi per la tua azienda.

Esplora i servizi per lo sviluppo di applicazioni Inizia a creare gratuitamente con IBM Cloud
Note a piè di pagina

Global software debugging market analysis [2023-2030," Benzinga, 5 settembre 2022
Google’s Bard AI chatbot can now generate and debug code," TechCrunch+, 12 aprile 2023
Autonomously debugging video games." University of Southern California-Viterbi School of Engineering, 5 aprile 2023
An easier way to get bugs out of programming languages," MIT News, 7 aprile 2023