🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Debugging con pdb in Python

Codegrind TeamSep 11 2024

Il debugging è una fase cruciale dello sviluppo software, ed è essenziale per trovare e risolvere bug o errori logici nel codice. In Python, il modulo pdb fornisce un debugger integrato che consente di analizzare e correggere il codice in modo interattivo, permettendo di eseguire il codice passo dopo passo, esaminare variabili e verificare il flusso di esecuzione. In questo articolo vedremo come utilizzare pdb per migliorare il processo di debugging.

Cos’è pdb?

pdb (Python Debugger) è un modulo integrato in Python che fornisce un ambiente di debugging interattivo. Con pdb, puoi fermare l’esecuzione del tuo programma in qualsiasi punto, ispezionare variabili, eseguire istruzioni passo dopo passo e verificare l’esecuzione del codice in modo preciso.

Come avviare pdb

Ci sono diversi modi per avviare il debugger pdb in Python:

  1. Inserendo manualmente un breakpoint nel codice.
  2. Esecuzione del codice direttamente con il comando pdb dalla linea di comando.
  3. Utilizzo del debugger integrato in un IDE, come PyCharm o VSCode.

Metodo 1: Aggiungere manualmente un breakpoint

Il modo più semplice per utilizzare pdb è inserire un breakpoint direttamente nel tuo codice usando la funzione pdb.set_trace(). Quando il programma raggiunge questo punto, l’esecuzione si interrompe, e puoi esaminare il contesto attuale.

Esempio:

import pdb

def somma(a, b):
    risultato = a + b
    pdb.set_trace()  # Inserisce il breakpoint
    return risultato

print(somma(5, 10))

Quando esegui questo codice, il debugger si avvia non appena raggiunge pdb.set_trace(), consentendoti di interagire con il contesto del programma.

Metodo 2: Eseguire il programma con pdb dalla linea di comando

Puoi anche avviare il debugger direttamente dalla linea di comando senza dover modificare il codice. Basta eseguire il tuo script con python -m pdb:

python -m pdb script.py

In questo modo, il programma verrà eseguito nel contesto di pdb, e potrai inserire breakpoints e ispezionare il flusso del programma durante l’esecuzione.

Comandi principali di pdb

Una volta all’interno del debugger, ci sono diversi comandi utili che puoi utilizzare per esplorare e controllare l’esecuzione del programma. Di seguito sono elencati i comandi più utili di pdb.

1. n (next)

Il comando n esegue l’istruzione corrente e passa alla successiva. Utilizza n per eseguire il programma una riga alla volta senza entrare nelle funzioni chiamate.

(pdb) n

2. s (step)

Il comando s entra all’interno di una funzione se viene chiamata sulla riga corrente. Questo è utile per esaminare cosa accade all’interno di una funzione.

(pdb) s

3. c (continue)

Il comando c riprende l’esecuzione del programma fino al successivo breakpoint o alla fine dell’esecuzione.

(pdb) c

4. p (print)

Il comando p stampa il valore di una variabile o di un’espressione. È utile per ispezionare lo stato delle variabili locali e globali durante il debugging.

(pdb) p variabile

5. l (list)

Il comando l elenca alcune righe di codice intorno al punto corrente di esecuzione per darti un contesto.

(pdb) l

6. b (breakpoint)

Il comando b consente di impostare un breakpoint in un punto specifico del codice, come una determinata riga o funzione. Ecco un esempio di come impostare un breakpoint sulla riga 10 del file script.py:

(pdb) b script.py:10

7. q (quit)

Il comando q esce dal debugger e termina l’esecuzione del programma.

(pdb) q

Un esempio completo di debugging con pdb

Ecco un esempio completo di un programma con un bug e come utilizzare pdb per risolverlo:

def divisione(a, b):
    return a / b

def main():
    x = 10
    y = 0
    pdb.set_trace()  # Breakpoint per fermare l'esecuzione
    risultato = divisione(x, y)
    print(risultato)

main()

In questo esempio, c’è un errore di divisione per zero. Avviando il programma, pdb ti consente di fermarti prima che l’errore venga sollevato:

(pdb) p x  # Controlla il valore di x
10
(pdb) p y  # Controlla il valore di y
0
(pdb) s  # Entra nella funzione divisione

Con pdb, puoi facilmente identificare e risolvere il problema nel codice prima che causi un crash dell’applicazione.

Debugging avanzato: Conditional Breakpoints

In alcuni casi, potrebbe essere utile inserire breakpoints condizionali, che fermano l’esecuzione solo quando una determinata condizione è vera. Puoi impostarli direttamente con il comando b:

(pdb) b 10, x > 5  # Interrompi l'esecuzione alla riga 10 solo se x è maggiore di 5

Vantaggi di pdb

  • Interattività: Consente di esaminare il programma in esecuzione senza dover continuamente interrompere e modificare il codice.
  • Facile da usare: Essendo uno strumento integrato, non richiede installazioni o configurazioni complesse.
  • Ispezione dettagliata: Puoi esplorare variabili, stack di chiamate, e il flusso di esecuzione in modo dettagliato.

Considerazioni Finali

pdb è uno strumento potente e versatile per il debugging in Python. Con la sua capacità di eseguire codice passo dopo passo, ispezionare variabili e inserire breakpoints dinamici, offre un controllo granulare sul processo di esecuzione del programma. Sebbene sia uno strumento semplice, può risolvere bug complessi in modo efficiente e rapido.