Share via


Rischi implicati durante l'impostazione dei punti di interruzione

Quando si imposta un punto di interruzione specificando un indirizzo di memoria o un simbolo più un offset, non è necessario inserire questo punto di interruzione al centro di un'istruzione.

Si consideri ad esempio il codice disassemblato seguente.

770000f1 5e               pop     esi
770000f2 5b               pop     ebx
770000f3 c9               leave
770000f4 c21000           ret     0x10
770000f7 837ddc00         cmp     dword ptr [ebp-0x24],0x0

Le prime tre istruzioni sono solo un byte lungo. Tuttavia, la quarta istruzione è di tre byte. Include byte 0x770000F4, 0x770000F5 e 0x770000F6. Se si vuole inserire un punto di interruzione in questa istruzione usando il comando bp, bu o ba , è necessario specificare l'indirizzo di 0x770000F4.

Se si inserisce un punto di interruzione nell'indirizzo 0x770000F5 usando il comando ba , il processore inserisce un punto di interruzione in tale posizione. Ma questo punto di interruzione non verrà mai attivato, perché il processore considera 0x770000F4 essere l'indirizzo effettivo dell'istruzione.

Se si inserisce un punto di interruzione nell'indirizzo 0x770000F5 usando i comandi bp o bu , il debugger scrive un punto di interruzione in tale posizione. Tuttavia, questo punto di interruzione potrebbe danneggiare la destinazione a causa del modo in cui il debugger crea punti di interruzione:

  1. Il debugger salva il contenuto di 0x770000F5 e sovrascrive questa memoria con un'istruzione del punto di interruzione.

  2. Se si tenta di visualizzare questa memoria nel debugger, il debugger non mostra l'istruzione del punto di interruzione scritta. Il debugger mostra invece la memoria che deve essere presente. Ovvero, il debugger mostra la memoria originale o tutte le modifiche apportate alla memoria apportata dopo l'inserimento del punto di interruzione.

  3. Se si usa il comando BC per rimuovere il punto di interruzione, il debugger ripristina la memoria originale nel percorso appropriato.

Quando si inserisce un punto di interruzione in 0x770000F5, il debugger salva questo byte e viene scritta qui un'istruzione di interruzione. Tuttavia, quando l'applicazione viene eseguita, raggiunge l'indirizzo 0x770000F4 e riconosce questo indirizzo come primo byte di un'istruzione multibyte. Il processore tenta quindi di combinare 0x770000F4, 0x770000F5 e probabilmente alcuni byte successivi in una singola istruzione. Questa combinazione può creare un'ampia gamma di comportamenti, nessuno dei quali è auspicabile.

Pertanto, quando si inseriscono punti di interruzione usando un comando bp, bu o ba , assicurarsi di inserire sempre i punti di interruzione nell'indirizzo appropriato. Se si usa l'interfaccia grafica WinDbg per aggiungere punti di interruzione, non è necessario preoccuparsi di questa situazione perché l'indirizzo corretto viene scelto automaticamente.

Risoluzione ambigua dei punti di interruzione

Nella versione 10.0.25310.1001 e successiva del motore del debugger è ora supportata la risoluzione ambigua dei punti di interruzione. I punti di interruzione ambigui consentono al debugger di impostare punti di interruzione in determinati scenari in cui un'espressione di punto di interruzione si risolve in più posizioni. Per altre informazioni, vedere Risoluzione dei punti di interruzione ambigua.

Vedi anche

Uso dei punti di interruzione

Sintassi punto di interruzione

bp, bu, bm (Set Breakpoint)

Risoluzione ambigua dei punti di interruzione

Punti di interruzione non risolti (punti di interruzione bu)