My IBM Accedi Iscriviti

Home

topics

Debugging

Cos'è il debugging?

Cos'è il debugging?

Esplora la soluzione di debug IBM Iscriviti alla newsletter di Think
Illustrazione con collage di pittogrammi di ingranaggi, braccio robotico, telefono cellulare

Data di pubblicazione: 16 settembre 2024
Autori: Camilo Quiroz-Vazquez

Cos'è il debugging?

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.

Risoluzione dei problemi e debug

Informazioni su come risolvere ed eseguire il debug degli errori più comuni in Resilient.

Contenuti correlati Cosa c'è di nuovo in IBM z/OS Debugger
Processo di debug

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 fallire 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 validare 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.

Esempi di debugging

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

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 delle cause
 

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.

Divide et impera
 

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 analisi, intelligenza artificiale (IA) e algoritmi di apprendimento automatico per automatizzare uno o più passaggi del processo di debug. Gli strumenti di debug basati sull'intelligenza artificiale 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

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 panorama 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 codice)2  e i ricercatori universitari stanno creando strumenti in grado di eseguire il debug dei videogiochi in modo autonomo3 e il debug di linguaggi di programmazione specifici del settore4.

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 (IDE)
 

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. 

Strumenti di analisi del codice statico
   

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

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

Soluzioni correlate

IBM Instana Observability

La piattaforma Instana Observability fornisce dati sulle prestazioni in tempo reale, completi di tutto il contesto, per tutti i tuoi team. Visibilità automatica dell'intero stack, granularità di 1 secondo e 3 secondi di notifica consentono una rapida identificazione per prevenire e risolvere i problemi.

Esplora IBM Instana Observability Richiedi una demo di IBM Instana
IBM Turbonomic

La piattaforma di ottimizzazione dei costi del cloud ibrido IBM Turbonomic consente di automatizzare continuamente e in tempo reale le azioni critiche che offrono proattivamente un utilizzo più efficiente delle risorse di calcolo, di storage e di rete per le app a ogni livello dello stack. 

Esplora IBM Turbonomic Prova IBM Turbonomic gratuitamente
IBM Cloud Pak per AIOps

Ottieni visibilità sui dati e sulle dipendenze degli ambienti IT con strumenti basati sull'AI che aiutano a gestire gli incidenti e a risolvere i problemi.

Esplora IBM Cloud Pak per AIOps Prova un tour autoguidato
Risorse

Risorse

Cos'è il test del software?

Il test del software è un processo che mira a verificare che un prodotto o un’applicazione software facciano ciò che devono fare.

Cos'è l'osservabilità?

L’osservabilità fornisce visibilità approfondita sulle moderne applicazioni distribuite per un’identificazione e una risoluzione dei problemi più rapida e automatizzata.

La pipeline CI/CD

La pipeline di integrazione continua/fornitura continua (CI/CD) ottimizza il processo di sviluppo del prodotto.

Scopri come una combinazione di componenti IT osservabili, machine learning e intelligenza artificiale (AI) consente di riconoscere i problemi del software in corso ancor prima che diventino incidenti.

Dati di log e di eventi relativi all'osservabilità del routing

Comprendi l’importanza di indirizzare in modo sicuro i log e i dati degli eventi con IBM Cloud Logs.

IBM Test Accelerator for Z

L’IBM Test Accelerator offre potenti strumenti per test automatizzati, distribuzione continua e flussi di lavoro di sviluppo semplificati.

Fai il passo successivo

IBM Debug for z/OS offre il debug e il code coverage per le applicazioni z/OS scritte in COBOL, PL/I, C/C++ e Assembler.

IBM Debug for z/OS
Note a piè di pagina

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