Esercizio - Usare il debugger predefinito di Node.js

Completato

Per mettere in pratica i concetti di debug appena illustrati, si creerà un'applicazione Node.js breve per calcolare il numero N della sequenza di Fibonacci.

La sequenza di Fibonacci è una successione di numeri che inizia con 0 e 1, in cui ogni altro numero che segue è la somma dei due numeri precedenti. La sequenza continua in questo modo:

0, 1, 1, 2, 3, 5, 8, 13, 21...

Verrà ora creata una nuova applicazione Node.js per illustrare il concetto.

Aprire il progetto nel contenitore di sviluppo

Questo modulo di training offre un contenitore di sviluppo, in un browser o per il computer locale. Questo contenitore fornisce tutto l'ambiente necessario per poter usare questo modulo di training senza dover installare un IDE o Node.js. Non è necessario conoscere nulla sul contenitore per completare questo modulo di training.

  1. Avviare il processo per creare un nuovo codespace GitHub nel ramo main del repository GitHub MicrosoftDocs/node-essentials.

  2. Nella pagina Crea codespace esaminare le impostazioni di configurazione del codespace e quindi selezionare Crea codespace

    Screenshot of the confirmation screen before creating a new codespace.

  3. Attendere l'avvio del codespace. Questo processo di avvio può richiedere alcuni minuti.

  4. Aprire un nuovo terminale nel codespace.

    Suggerimento

    È possibile usare il menu principale per passare all'opzione di menu Terminale e quindi selezionare l'opzione Nuovo terminale.

    Screenshot of the codespaces menu option to open a new terminal.

  5. Verificare che Node.js sia installato nell'ambiente:

    node --version
    

    Il contenitore di sviluppo usa una versione LTS Node.js. La versione esatta potrebbe essere diversa.

  6. Gli esercizi rimanenti in questo progetto si svolgono nel contesto di questo contenitore di sviluppo.

Preparare l'ambiente

Prima di entrare nel dettaglio dell'esercizio, è necessario preparare il codice e l'ambiente.

  1. Aprire la sottocartella ./nodejs-debug, quindi creare un nuovo file JavaScript denominato myfibonacci.js. Il file già esistente nella cartella è una soluzione all'esercizio, con la correzione necessaria per il bug trovato durante il debug.

  2. Incollare il codice seguente nel file:

    function fibonacci(n) {
      let n1 = 0;
      let n2 = 1;
      let sum = 0;
    
      for (let i = 2; i < n; i++) {
        sum = n1 + n2;
        n1 = n2;
        n2 = sum;
      }
    
      return n === 0 ? n1 : n2;
    }
    
    const result = fibonacci(5);
    console.log(result);
    
  3. Salvare il file, CTRL + S.

  4. Fare clic con il pulsante destro del mouse sulla ./nodejs-debug sottocartella e selezionare Open in integrated terminal ed eseguire il programma usando il comando seguente:

    node fibonacci.js
    

L'applicazione dovrebbe visualizzare il risultato 3 (tre) nella console. Sembra che ci sia un bug, dal momento che il risultato previsto era 5 (cinque). Si cercherà ora di capire il problema usando il debugger predefinito di Node.js.

Foglio informativo dei comandi del debugger

Il debugger predefinito Node.js include un set di comandi che è possibile usare per controllare l'esecuzione del programma. Ecco un rapido foglio informativo dei comandi più comuni:

Comando Descrizione
c continua. Continua l'esecuzione fino al punto di interruzione successivo o alla fine del programma.
next Esegui istruzione/routine. Questo comando è simile al comando, ad eccezione del step fatto che se la riga di codice successiva è una chiamata di funzione, esegue la funzione senza eseguirne l'istruzione.
s esegue l'istruzione. Questo comando è simile al comando, ad eccezione delnext fatto che se la riga di codice successiva è una chiamata di funzione, passare alla prima riga del codice di questa funzione.
sb() aggiunge un punto di interruzione nella riga corrente.
exec <EXPR> valuta un'espressione nel contesto di esecuzione corrente. Questo comando è utile per ottenere informazioni sullo stato corrente. È ad esempio possibile ottenere il valore di una variabile denominata i usando exec i.
Ctrl + D Arresta il debugger.

Avviare il debugger predefinito

Avviare di nuovo il programma, questa volta con il debugger predefinito abilitato. Immettere questo comando nel terminale:

node inspect fibonacci.js

Nel terminale verrà visualizzato il prompt del debugger. A questo punto, eseguire il codice eseguendo s + <Enter> fino a quando il punto di esecuzione non si trova all'inizio della fibonacci funzione, come illustrato di seguito:

break in fibonacci.js:2
  1 function fibonacci(n) {
> 2   let n1 = 0;
  3   let n2 = 1;
  4   let sum = 0;
debug>

A questo punto, è possibile controllare il valore del parametro n che viene passato nella funzione eseguendo il comando seguente:

exec n

Dovrebbe essere visualizzato 5 (cinque) come risultato nella console. Continuare a eseguire il codice usando il comando s fino a quando il punto di esecuzione non si trova all'interno dell'inizio del ciclo. Per raggiungere questo punto, sono necessari cinque passaggi con il comando s:

break in fibonacci.js:7
  5
  6   for (let i = 2; i < n; i++) {
> 7     sum = n1 + n2;
  8     n1 = n2;
  9     n2 = sum;
debug>

Nota

Si noterà che per spostarsi all'interno della riga for(...) {} sono necessari più passaggi con i comandi di debug. Ciò si verifica perché in questa riga sono presenti più istruzioni. Quando si esegue l'istruzione, si passa all'istruzione successiva nel codice. In genere, è presente una sola istruzione per riga. In caso contrario, sono necessari più passaggi per passare alla riga successiva.

Individuare il bug con i punti di interruzione

Ora verrà aggiunto un punto di interruzione in questa riga in modo da spostarsi rapidamente tra le iterazioni del ciclo. Immettere il comando seguente nel terminale:

sb()

Verranno di nuovo visualizzate le stesse righe nella console, a indicare che è stato impostato un punto di interruzione in questa riga. Quando si sposta il punto di esecuzione corrente, si vedrà un asterisco * nella riga in cui è stato impostato il punto di interruzione.

Passare all'iterazione del ciclo successiva eseguendo il comando c nel terminale:

c

È possibile controllare lo stato di iterazione corrente con il comando exec e visualizzare il valore di più variabili usando una matrice come parametro di comando. Per visualizzare i valori dell'iteratore i e il totale sum, si usa la sintassi [i, sum]. Immettere questo comando nel terminale:

exec [i, sum]

Nella console verrà visualizzato il risultato [ 3, 1 ].

Il codice non ha ancora aggiornato il valore della variabile sum per l'iterazione corrente, ovvero 3 (tre). Il valore della variabile sum mostra ancora il numero di Fibonacci per l'iterazione precedente. Ecco il calcolo usato nel codice per ottenere il valore sum corrente:

fibonacci(2) = fibonacci(0) + fibonacci(1)
             = 0 + 1
             = 1

In base al calcolo, sembra che il programma venga eseguito correttamente fino a questo punto.

Continuare con l'iterazione del ciclo successiva eseguendo il comando c nel terminale, quindi controllare di nuovo lo stato:

c
exec [i, sum]

Nella console verrà visualizzato il risultato [ 4, 2 ].

A questo punto ci si trova subito prima del numero di iterazione a cui si è interessati, ovvero 5 (cinque). Per essere prudenti, è consigliabile avanzare un'istruzione alla volta nell'iterazione usando il comando s. Provare a raggiungere il punto di interruzione precedente, ma procedendo un'istruzione alla volta. Non superare il punto di interruzione.

Che cosa è successo?

Correggere il bug

Dopo avere verificato la condizione del ciclo i < n, l'esecuzione è passata improvvisamente alla riga che contiene il comando return. Ecco cosa dovrebbe essere visualizzato nel terminale:

break in fibonacci.js:12
 10   }
 11
>12   return n === 0 ? n1 : n2;
 13 }
 14

Ecco il bug! Invece di aggiornare la somma per l'iterazione 5 (cinque), il codice è uscito dal ciclo. Per questo motivo, è stato ottenuto il risultato dell'iterazione precedente 3 (tre) nell'esecuzione iniziale.

È necessario correggere la condizione del ciclo nel codice fibonacci.js. Nell'editor di codice modificare il valore dell'istruzione di test da minore di < a minore o uguale a <=:

for (let i = 2; i <= n; i++) {
  sum = n1 + n2;
  n1 = n2;
  n2 = sum;
}

Salvare le modifiche nell'editor di codice e quindi uscire dal debugger selezionando CTRL+D.

Eseguire di nuovo il programma nel terminale:

node fibonacci.js

Nella console dovrebbe ora essere visualizzato il risultato previsto, ovvero 5 (cinque).

È possibile usare il debugger predefinito in Node.js per apprendere i principi di base del debug e per sessioni di debug rapide. Digitare i comandi può essere noioso e questo strumento può risultare troppo limitato e difficile da usare con i programmi complessi.

Nelle sezioni successive verrà illustrato come usare in alternativa il debugger di Visual Studio Code.