Condividi tramite


Debug in modalità assembly

Se si dispone di file di origine C o C++ per l'applicazione, è possibile usare il debugger in modo molto più potente se si esegue il debug in modalità di origine.

Tuttavia, molte volte non è possibile eseguire il debug di origine. È possibile che non siano presenti i file di origine per l'applicazione. È possibile eseguire il debug del codice di un altro utente. È possibile che i file eseguibili non siano stati compilati con simboli PDB completi. Inoltre, anche se è possibile eseguire il debug di origine nell'applicazione, potrebbe essere necessario tracciare routine di Microsoft Windows chiamate dall'applicazione o usate per caricare l'applicazione.

In queste situazioni, è necessario eseguire il debug in modalità assembly. Inoltre, la modalità assembly include molte funzionalità utili che non sono presenti nel debug di origine. Il debugger visualizza automaticamente il contenuto dei percorsi di memoria e i registri quando si accede e visualizza l'indirizzo del contatore del programma. Questa visualizzazione rende il debug degli assembly uno strumento prezioso che è possibile usare insieme al debug dell'origine.

Codice disassembly

Il debugger analizza principalmente il codice eseguibile binario. Invece di visualizzare questo codice in formato non elaborato, il debugger disassembla questo codice. Ovvero, il debugger converte il codice dal linguaggio del computer al linguaggio assembly.

È possibile visualizzare il codice risultante (noto come codice disassembly) in diversi modi:

  • Il comando u (Unassemble) disassembla e visualizza una sezione specificata del linguaggio del computer.

  • Il comando uf (Funzione unassemble) disassembla e visualizza una funzione.

  • Il comando up (Unassemble from Physical Memory) viene disassemblato e visualizza una sezione specificata del linguaggio del computer archiviato in memoria fisica.

  • Il comando (Unassemble Real Mode BIOS) viene disassemblato e visualizza un codice in modalità reale a 16 bit specificato.

  • Il comando ux (Unassemble x86 BIOS) disassembla e visualizza l'istruzione di codice BIOS basata su x86 impostata in corrispondenza di un indirizzo specificato.

  • (solo WinDbg) La finestra disassembly disassembla e visualizza una sezione specificata del linguaggio del computer. questa finestra è attiva automaticamente se si seleziona il comando disassembly aperto automaticamente nel menu della finestra . è anche possibile aprire questa finestra selezionando disassembly nel menu di visualizzazione, premendo ALT+7 o premendo il pulsante disassembly (alt+7).

La visualizzazione disassembly viene visualizzata in quattro colonne: offset degli indirizzi, codice binario, mnemonic del linguaggio assembly e dettagli del linguaggio assembly. L'esempio seguente mostra questa visualizzazione.

0040116b    45          inc         ebp            
0040116c    fc          cld                        
0040116d    8945b0      mov         eax,[ebp-0x1c] 

A destra della riga che rappresenta il contatore corrente del programma, nella visualizzazione vengono visualizzati i valori di eventuali percorsi di memoria o registri a cui si accede. Se questa riga contiene un'istruzione di ramo, viene visualizzata la notazione [br=1] o [br=0]. Questa notazione indica un ramo che è o non viene acquisito, rispettivamente.

È possibile usare il comando .asm (Change Disassembly Options) per modificare la modalità di visualizzazione delle istruzioni disassemblate.

Nella finestra Disassembly di WinDbg la riga che rappresenta il contatore del programma corrente è evidenziata. Vengono evidenziate anche le righe in cui vengono impostati i punti di interruzione.

È anche possibile usare i comandi seguenti per modificare il codice dell'assembly:

  • Il comando # (cerca modello disassembly) cerca un'area di memoria per un modello specifico. Questo comando equivale alla ricerca delle quattro colonne della visualizzazione disassembly.

  • Il comando (Assembl) può accettare istruzioni di assembly e convertirle in codice macchina binaria.

Modalità assembly e modalità di origine

Il debugger ha due modalità operative diverse: modalità assembly e modalità di origine.

Quando si esegue un'istruzione singola in un'applicazione, le dimensioni di un singolo passaggio sono una riga di codice assembly o una riga di codice sorgente, a seconda della modalità.

Diversi comandi creano visualizzazioni di dati diverse a seconda della modalità.

In WinDbg la finestra Disassembly si sposta automaticamente in primo piano quando si esegue o si esegue un'applicazione in modalità assembly. In modalità di origine la finestra Origine viene spostata in primo piano.

Per impostare la modalità, è possibile eseguire una delle operazioni seguenti:

  • Usare il comando l+, l- (Imposta opzioni di origine) per controllare la modalità. Il comando l-t attiva la modalità assembly.

  • (solo WinDbg) Deselezionare il comando Modalità di origine nel menu Debug per fare in modo che il debugger entri in modalità assembly. È anche possibile selezionare il pulsante Modalità di origine disattivata sulla barra degli strumenti.

In WinDbg, quando si è in modalità assembly, ASM viene visualizzato sulla barra di stato.

Il menu di scelta rapida nella finestra Disassembly di WinDbg include le istruzioni Evidenzia dal comando della riga di origine corrente . Questo comando evidenzia tutte le istruzioni corrispondenti alla riga di origine corrente. Spesso, una singola riga di origine corrisponde a più istruzioni di assembly. Se il codice è stato ottimizzato, queste istruzioni di assembly potrebbero non essere consecutive. Le istruzioni evidenziate dal comando della riga di origine corrente consentono di trovare tutte le istruzioni assemblate dalla riga di origine corrente.

File di origine del linguaggio assembly

Se l'applicazione è stata scritta nel linguaggio assembly, il disassembly prodotto dal debugger potrebbe non corrispondere esattamente al codice originale. In particolare, non saranno presenti NO-OPs e commenti.

Per eseguire il debug del codice facendo riferimento ai file con estensione asm originali, è necessario usare il debug in modalità origine. È possibile caricare il file di assembly come un file di origine C o C++. Per altre informazioni su questo tipo di debug, vedere Debug in modalità origine.