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.
-
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.
-
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.
-
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.
# 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;
}
-
[ ] 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.