Tecniche Debugging — Cheat Sheet

Tag: debugging, troubleshooting, breakpoints, logging, profiling, git

Livello: intermedio

TL;DR: Metodologie e strumenti pratici per identificare, isolare e risolvere difetti nel software in modo sistematico, riducendo i tempi di risoluzione.

Concetti chiave

-

Rubber duck debugging: spiegare il codice ad alta voce riga per riga per far emergere falle logiche.

-

Ricerca dicotomica (divide et impera): isolare l'errore disabilitando meta' del sistema iterativamente per restringere l'area problematica.

-

Riproducibilita' garantita: scrivere un test isolato e deterministico che fallisce costantemente prima di tentare qualsiasi fix.

-

Lettura dello stack trace: analizzare la catena di chiamate partendo dall'errore finale risalendo verso l'origine dell'eccezione.

-

Logging differenziale: tracciare lo stato delle variabili prima e dopo un blocco di codice per notare mutazioni impreviste.

-

Analisi statica: utilizzare linter e analizzatori di codice per prevenire bug prima dell'esecuzione.

-

Bisezione del repository: usare tool di versioning per eseguire una ricerca binaria nella cronologia dei commit.

Domande tipiche e risposte pronte

-

Q: Come affronti un bug in produzione che non riesci a riprodurre in locale?R: Isolo il contesto analizzando i log e i dump di memoria, verifico i dati in input e cerco di replicare il subset esatto del database in un ambiente di staging.

-

Q: Qual e' la differenza tra "step over" e "step into" durante una sessione di debug?R: Step over esegue la funzione corrente e passa alla riga successiva, step into entra nel dettaglio del codice della funzione chiamata.

-

Q: Perche' a volte un bug sparisce quando si avvia il debugger (heisenbug)?R: Di solito e' legato a race condition o problemi di concorrenza, dove il rallentamento introdotto dal debugger altera il tempismo di esecuzione mascherando l'errore.

Insidie e errori comuni

-

Curare il sintomo (ad esempio catturando silenziosamente un'eccezione) ignorando la causa radice a monte.

-

Riempire il codice di istruzioni di stampa su console e dimenticarle attive nell'ambiente di produzione.

-

Modificare il codice alla cieca procedendo per tentativi, perdendo traccia degli effetti collaterali introdotti.

-

Non controllare i permessi di ambiente e le variabili di configurazione prima di ipotizzare bug complessi nel codice.

Snippet e comandi

# Avvio di una ricerca binaria per trovare il commit che ha introdotto un bug
git bisect start
git bisect bad HEAD
git bisect good v2.1.0

# Al termine della ricerca per ripristinare il branch
git bisect reset

JavaScript

# Esempio di conditional breakpoint logico in Node.js
// Utile per evitare fermi inutili in cicli molto lunghi
if (user.id === 'debug_target_123') {
    debugger;
}

Da ripassare

-

[ ] Profilazione avanzata della memoria e individuazione di memory leak.

-

[ ] Utilizzo profondo del debugger CLI nativo del linguaggio principale.

-

[ ] Configurazione di remote debugging in ambienti containerizzati.

Jarvis Interviews
Jarvis