Leggere in inglese

Condividi tramite


Debug in modalità assembly

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

Tuttavia, esistono molte volte che 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. Potrebbe non aver compilato i file eseguibili con simboli .pdb completi. E anche se è possibile eseguire il debug di origine nell'applicazione, potrebbe essere necessario tracciare le 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 durante l'accesso e visualizza l'indirizzo del contatore del programma. Questa visualizzazione rende il debug degli assembly uno strumento prezioso che è possibile usare insieme al debug di origine.

Codice di disassemblaggio

Il debugger analizza principalmente il codice eseguibile binario. Anziché 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 (Smonta dalla Memoria Fisica) disassembla e visualizza una sezione specificata del linguaggio macchina memorizzato nella memoria fisica.

  • Il comando ur (Unassemble Real Mode BIOS) disassembla 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 su un indirizzo specificato.

  • (solo WinDbg) La finestra disassembly disassembla e visualizza una sezione specificata del linguaggio del computer. questa finestra è automaticamente attiva se si seleziona il comando apertura automatica del disassembly nel menu 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 mostrata in quattro colonne: offset degli indirizzi, codice binario, mnemonico dell'assembly e dettagli del linguaggio di 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 del programma corrente, nella visualizzazione vengono visualizzati i valori di tutti i percorsi di memoria o i 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 (Cambia opzioni disassembly) 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 in un'area di memoria un modello specifico. Questo comando equivale alla ricerca delle quattro colonne della visualizzazione disassembly.

  • Il comando (Assembl) può accettare istruzioni sull'assembly e convertirle in codice binario del computer.

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 avvia o si esegue un'applicazione in modalità assembler. In modalità di origine, la finestra Origine passa 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à origine dal menu Debug per fare in modo che il debugger entri in modalità assembly. È anche possibile selezionare il pulsante Modalità di origine disattivato 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 il comando Evidenzia le istruzioni dalla riga di origine corrente. Questo comando evidenzia tutte le istruzioni che corrispondono 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. Il comando Evidenzia istruzioni della riga di origine corrente consente 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 inclusi 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.