Passaggio 4: Eseguire il codice nel debugger

Passaggio precedente: Usare la finestra Interattiva REPL

Visual Studio offre funzionalità per gestire progetti, un'esperienza di modifica avanzata, la finestra interattiva e il debug completo per il codice Python. Nel debugger, è possibile eseguire il codice in dettaglio, incluse le interazioni di un ciclo. È anche possibile sospendere il programma ogni volta che vengono soddisfatte determinate condizioni. Quando il programma viene sospeso nel debugger, è possibile esaminare in qualsiasi momento lo stato dell'intero programma e modificare il valore di variabili. Tali azioni sono essenziali per tenere traccia dei bug del programma e forniscono anche utili strumenti per seguire il flusso esatto del programma.

  1. Sostituire il codice nel file PythonApplication1.py con il codice seguente. Questa variante del codice espande make_dot_string in modo da poter esaminare i passaggi discreti nel debugger. Inserisce anche il ciclo for in una funzione main e lo esegue in modo esplicito chiamando la funzione:

    from math import cos, radians
    
    # Create a string with spaces proportional to a cosine of x in degrees
    def make_dot_string(x):
        rad = radians(x)                             # cos works with radians
        numspaces = int(20 * cos(rad) + 20)          # scale to 0-40 spaces
        st = ' ' * numspaces + 'o'                   # place 'o' after the spaces
        return st
    
    def main():
        for i in range(0, 1800, 12):
            s = make_dot_string(i)
            print(s)
    
    main()
    
  2. Controllare che il codice funzioni correttamente. A tale scopo, premere F5 o selezionare il comando di menu Debug>Avvia debug. Questo comando esegue il codice nel debugger. Per il momento, non è stato fatto nulla per sospendere il programma mentre è in esecuzione, si stampa solo un modello di onda per alcune iterazioni. Premere un tasto qualsiasi per chiudere la finestra di output.

    Suggerimento

    Perché la finestra di output si chiuda automaticamente al completamento del programma, selezionare il comando di menu Strumenti>Opzioni, espandere il nodo Python, selezionare Debug e deselezionare l'opzione Attendi input quando il processo viene chiuso normalmente:

    Python debugging option to close the output window on normal program exit

    Per altre informazioni sul debug e su come impostare gli argomenti di script e interprete, vedere Eseguire il debug del codice Python.

  3. Impostare un punto di interruzione sull'istruzione for facendo clic nel margine grigio a sinistra della riga oppure posizionare il cursore nella riga e usare il comando Debug>Attiva/Disattiva punto di interruzione (F9). Sul margine grigio viene visualizzato un punto rosso per indicare il punto di interruzione, come indicato dalla freccia blu di seguito:

    Setting a breakpoint

  4. Avviare di nuovo il debugger (F5). Si può vedere che l'esecuzione del codice si interrompe in corrispondenza della riga con il punto di interruzione. È così possibile analizzare lo stack di chiamate ed esaminare le variabili locali. Le variabili incluse nell'ambito, quando definite, vengono visualizzati nella finestra Auto ; è anche possibile passare alla visualizzazione Variabili locali nella parte inferiore della finestra per visualizzare tutte le variabili che Visual Studio individua nell'ambito attuale (funzioni incluse), comprese quelle non ancora definite:

    Breakpoint UI experience for Python

  5. Osservare la barra degli strumenti di debug (visualizzata di seguito) nella parte superiore della finestra di Visual Studio. Questa barra degli strumenti consente di accedere rapidamente ai comandi di debug più comuni (disponibili nel menu Debug):

    Essential debugging toolbar buttons

    I pulsanti da sinistra a destra nel modo seguente:

    Pulsante Comando
    Continua (F5) Esegue il programma fino al punto di interruzione successivo o fino al completamento del programma.
    Interrompi tutto (CTRL+ALT+INTERRUZIONE) Sospende un programma a esecuzione prolungata.
    Arresta debug (MAIUSC+F5) Arresta il programma ovunque si trovi e esce dal debugger.
    Riavvia (CTRL+MAIUSC+F5) Arresta il programma ovunque si trovi e lo riavvia dall'inizio del debugger.
    Mostra istruzione next (ALT+Num*) Passa alla riga di codice successiva da eseguire. Ciò è utile quando si sposta all'interno del codice durante una sessione di debug e si vuole tornare rapidamente al punto in cui il debugger viene sospeso.
    Esegui istruzione in (F11) Esegue la riga di codice successiva, immettendo le funzioni chiamate.
    Esegui passaggi (F10) Esegue la riga di codice successiva senza immettere funzioni chiamate.
    Esci (Maiusc+F11) Esegue il resto della funzione corrente e si sospende nel codice chiamante.
  6. Eseguire l'istruzione/routine for usando Esegui istruzione/routine. L'esecuzione di istruzioni prevede l'esecuzione della linea di codice corrente da parte del debugger, incluse le chiamate di funzione, e poi di nuovo una pausa immediata. Si noti nel codice come la variabile i è ora definita nelle finestre Variabili locali e Auto .

  7. Eseguire l'istruzione/routine alla riga successiva del codice che chiama make_dot_string e si sospende. Esegui istruzione/routine in questo caso indica in modo specifico che il debugger esegue l'intero make_dot_string e dopo la restituzione si sospende. Il debugger non si arresta all'interno di tale funzione, a meno che non esista un punto di interruzione separato.

  8. Ripetere altre volte l'esecuzione dell'istruzione/routine e osservare in che modo si modificano i valori Variabili locali o Auto.

  9. Nella finestra Variabili locali o Auto fare doppio clic sulla colonna Valore per le variabili i o s per modificare il valore. Premere INVIO o selezionare un'area esterna a tale valore per applicare eventuali modifiche.

  10. Continuare l'esecuzione nel codice usando Esegui istruzione. Esegui istruzione indica che il debugger viene inserito all'interno di una qualsiasi chiamata di funzione per la quale ha informazioni di debug, ad esempio make_dot_string. Una volta dentro a make_dot_string è possibile esaminare le variabili locali ed eseguire i passaggi nel codice.

  11. Continuare l'esecuzione con Esegui istruzione. Si noti che quando si raggiunge la fine di make_dot_string, il passaggio successivo restituisce al ciclo for il nuovo valore restituito nella variabile s. Quando si esegue di nuovo il passaggio all'istruzione, si noti che l'istruzione print Eseguiprint istruzione su non entra in tale funzione. Questo perché print non è scritto in Python, ma è piuttosto codice nativo all'interno del runtime Python.

  12. Continuare a usare Esegui istruzione fino a quando non si è nuovamente in make_dot_string. Quindi usare Esci da istruzione/routine. Si noti che si è fatto ritorno al ciclo for. Con Esci da istruzione/routine, il debugger esegue il resto della funzione e quindi si sospende automaticamente nel codice chiamante. Ciò è utile quando si è eseguito il debug di una parte di una funzione lunga. Eseguirà il resto e non imposta un punto di interruzione esplicito nel codice chiamante.

  13. Per continuare l'esecuzione del programma, fino a quando non viene raggiunto il punto di interruzione successivo, usare Continua (F5). Dato che il ciclo for contiene un punto di interruzione, l'esecuzione viene interrotta nell'iterazione successiva.

  14. Scorrere centinaia di iterazioni di un ciclo può risultare noioso, pertanto in Visual Studio è possibile aggiungere una condizione a un punto di interruzione. Il debugger sospende quindi il programma nel punto di interruzione solo quando la condizione viene soddisfatta. Ad esempio, è possibile usare una condizione con il punto di interruzione sull'istruzione for in modo che non venga sospeso solo quando il valore di i supera 1600. Per impostare la condizione, fare clic con il pulsante destro del mouse sul punto di interruzione rosso e selezionare Condizioni (ALT+F9>C). Nella finestra Impostazioni punto di interruzione visualizzata immettere i > 1600 come espressione e selezionare Chiudi. Premere F5 per continuare e osservare che il programma esegue diverse iterazioni prima del punto di interruzione successivo.

    Setting a breakpoint condition

  15. Per eseguire il programma al completamento, disabilitare il punto di interruzione facendo clic con il pulsante destro del mouse sul margine e scegliendo Disabilita punto di interruzione (CTRL+F9). Quindi selezionare Continua (o premere F5) per eseguire il programma. Quando termina, Visual Studio arresta la sessione di debug e restituisce la modalità di modifica. È anche possibile eliminare il punto di interruzione selezionandone il punto o facendo clic con il pulsante destro del mouse sul punto e scegliendo Elimina punto di interruzione. Elimina anche qualsiasi condizione impostata in precedenza.

Suggerimento

In alcune situazioni, come ad esempio quando si verifica un errore durante l'avvio dell'interprete Python stesso, la finestra di output potrebbe essere visualizzata solo per pochissimo tempo e poi chiudersi automaticamente, impedendo la visualizzazione dei messaggi di errore. Se questo dovesse verificarsi, fare clic con il pulsante destro del mouse sul progetto in Esplora soluzioni, scegliere Proprietà, selezionare la scheda Debug, quindi aggiungere -i al campo Argomenti dell'interprete. Questo argomento fa sì che l'interprete passi in modalità interattiva dopo il completamento di un programma, mantenendo la finestra aperta fino a quando non viene premuto CTRL+Z>INVIO per chiuderla.

Passaggio successivo

Approfondimento