設定中斷點時需要的風險
當您藉由指定記憶體位址或符號加上位移來設定 中斷點 時,您不得將此中斷點放在指令中間。
例如,請考慮下列反組解碼。
770000f1 5e pop esi
770000f2 5b pop ebx
770000f3 c9 leave
770000f4 c21000 ret 0x10
770000f7 837ddc00 cmp dword ptr [ebp-0x24],0x0
前三個指令只有一個位元組長。 不過,第四個指令的長度為三個位元組。 (它包含位元組0x770000F4、0x770000F5和 0x770000F6.) 如果您想要使用 bp、 bu或 ba 命令在此指令上放置中斷點,您必須指定0x770000F4位址。
如果您使用 ba 命令將中斷點放在0x770000F5位址中,處理器會將中斷點放在該位置。 但永遠不會觸發此中斷點,因為處理器會將0x770000F4視為指令的實際位址。
如果您使用 bp 或 bu 命令將中斷點放在0x770000F5位址中,偵錯工具會在該位置寫入中斷點。 不過,此中斷點可能會因為偵錯工具如何建立中斷點而損毀目標:
偵錯工具會儲存0x770000F5的內容,並使用中斷點指令覆寫此記憶體。
如果您嘗試在偵錯工具中顯示此記憶體,偵錯工具不會顯示已寫入的中斷點指令。 相反地,偵錯工具會顯示「應該」的記憶體。 也就是說,偵錯工具會顯示原始記憶體,或插入中斷點之後對該記憶體所做的任何修改。
如果您使用 BC 命令移除中斷點,偵錯工具會將原始記憶體還原到其適當的位置。
當您將中斷點放在0x770000F5時,偵錯工具會儲存此位元組,並在這裡撰寫中斷指令。 不過,當應用程式執行時,它會到達0x770000F4位址,並將此位址辨識為多位元組指令的第一個位元組。 處理器接著會嘗試將0x770000F4、0x770000F5,以及稍後的一些位元組合併成單一指令。 這種組合可以建立各種行為,而不需要。
因此,當您使用 bp、 bu或 ba 命令放置中斷點時,請確定您一律將中斷點放在適當的位址。 如果您使用 WinDbg 圖形化介面來新增中斷點,就不需要擔心這種情況,因為會自動選擇正確的位址。
模棱兩可的中斷點解析
在偵錯工具引擎的 10.0.25310.1001 版和更新版本中,現在支援模棱兩可的中斷點解析。 模棱兩可的中斷點可讓偵錯工具在中斷點運算式解析為多個位置的特定案例中設定中斷點。 如需詳細資訊,請參閱 模棱兩可的中斷點解析。