Debugger

Il Debugger mostra lo stato del contratto durante lo svolgimento di una transazione.

Può essere utilizzato su transazioni create su Remix o fornendo l’hash di una transazione. Quest’ultima condizione presuppone che si disponga del codice sorgente del contratto o che si sia inserito l’indirizzo di un contratto verificato.

Per avviare una sessione di debug:

  • Fare click sul pulsante di debug nel Terminale quando viene visualizzata una transazione riuscita o fallita. Il Debugger verrà attivato e portato in primo piano nel Pannello laterale.

  • Attivare il Debugger nel Plugin Manager e poi fare clic sul bug nel pannello delle icone. Per avviare la sessione di debug, inserire l’indirizzo di una transazione distribuita, mentre il codice sorgente è nell’editor, quindi fare clic sul pulsante Avvia il debug.

Il debugger evidenzierà il codice pertinente nell’editor. Se si desidera tornare a modificare il codice senza le evidenziazioni del Debugger, fare clic sul pulsante Ferma il debug.

Per saperne di più sull’uso di questo strumento, consultare la pagina [Debug delle transazioni] (tutorial_debug.html).

Questa pagina illustra l’opzione Usa sorgenti generate del Debugger, la sua navigazione e i suoi pannelli.

Usa sorgenti generate

This option is available for contracts using Solidity 0.7.2 or greater. See the solidity blog for more details about generated sources.

L’uso di sorgenti generati renderà più facile la verifica dei contratti. Quando l’opzione è selezionata, è possibile accedere ai risultati del compilatore durante il debug.

Questi output del compilatore appariranno in un file .yul separato nell’editor di Remix.

La Navigazione del Debugger

Cursore & pulsanti

Cursore

Spostando il cursore si evidenzia il codice corrispondente nell”Editor. Al livello più fine, il cursore scorre i codici operativi di una transazione (vedi la sezione codici operativi qui sotto). Ad ogni codice operativo, lo stato della transazione cambia e questi cambiamenti si riflettono nei pannelli del Debugger.

Passa sopra indietro

Questo pulsante passa al codice operativo precedente. Se il passo precedente comporta una invocazione di funzione, la funzione non verrà inserita.

Passo indietro

Questo pulsante consente di tornare al codice operativo precedente.

Passo avanti

Questo pulsante consente di passare al codice operativo successivo. Se la riga successiva contiene una invocazione di funzione, Passo avanti entrerà nella funzione.

Passa sopra avanti

Questo pulsante consente di passare al codice operativo successivo. Se il passo successivo comporta una invocazione di funzione, la funzione non verrà inserita.

Vai al punto di interruzione precedente

I punti di interruzione possono essere posizionati nel riquadro dell’Editor. Se il passaggio corrente dell’invocazione ha superato un punto di interruzione, questo pulsante sposterà il cursore sul punto di interruzione superato più di recente.

Salta fuori

Quando sei in un’invocazione e fai clic su questo pulsante, il cursore verrà spostato alla fine dell’invocazione.

Vai al prossimo breakpoint

Se un punto di interruzione è più avanti nel codice, questo pulsante avanzerà a quel punto.

I Pannelli del Debugger

Pila delle Funzioni

Lo pila delle funzioni elenca le funzioni con cui la transazione sta interagendo.

Solidity Locals

Le «Solidity Locals» sono le variabili locali all’interno di una funzione.

Stato di Solidity

Queste sono le variabili di stato del contratto.

Codici operativi

Questo pannello mostra il numero di passaggio e il codice operativo su cui si trova attualmente il debugger.

Trascinando il cursore (che si trova sopra i pulsanti di navigazione), il numero del passaggio selezionato e il codice operativo cambiano.

Dettagli del passaggio

I dettagli del passaggio mostrano ulteriori informazioni sul passaggio del codice operativo.

Pila

Questo pannello mostra la pila EVM.

Per maggiori informazioni sulla stack.

Memoria

La memoria viene svuotata per ogni nuova invocazione di messaggio. La memoria è lineare e ci si può rivolgere a livello di byte. Le letture sono limitate a una larghezza di 256 bit, mentre le scritture possono essere di 8 o 256 bit.

Il pannello Memoria è composto da 3 colonne. Potrebbe essere necessario allargare un po” il pannello laterale di Remix per ottenere una formattazione corretta. (Trascina il bordo tra il pannello principale e quello laterale verso destra).

La prima colonna è la posizione in memoria. La seconda colonna è il valore codificato in esadecimale. La terza colonna è il valore decodificato. Se non c’è nulla, vengono mostrati dei punti interrogativi (?), come in questo caso:

0x10: 00000000000000000000000000000000 ????????????????

Ecco un esempio completo del pannello Memoria

Alcuni slot di indirizzo hanno valori codificati in esadecimale e tali valori vengono poi decodificati. Ad esempio, controllare le posizioni 0xa0 e 0x140.

Archiviazione

This is the persistent storage.

Stack di Chiamata

Tutte le computazioni sono eseguite su un array di dati chiamato call stack. Ha una grandezza massima di 1024 elementi e contiene parole di 256 bits.

Dati di Chiamata

I dati di chiamata contengono i parametri delle funzioni.

Valore Restituito

Si riferisce al valore che la funzione restituirà.

Modifiche Complete dell’Archiviazione

This shows the persistent storage at the end of the function.

Punti di interruzione

Per mettere in pausa il debugger, è possibile posizionare dei punti di interruzione nel riquadro dell’editor.

Ulteriori Informazioni

Le informazioni minuziose del debugger forniscono agli utenti informazioni dettagliate su ciò che accade in una transazione, quindi non solo il debugger è utile per il debugging, ma è anche un eccellente strumento didattico.

Per imparare a usare il debugger, consultare [Debug delle transazioni] (tutorial_debug.html).