處理器根據偵錯工具的要求所控制的岔斷點稱為 處理器岔斷點 或 資料岔斷點。 偵錯工具直接控制的中斷點稱為 軟體中斷點。
注意 雖然 資料中斷點 一詞通常用作 處理器中斷點 的同義詞,但此術語可能會產生誤導。 中斷點有兩種基本類型:處理器中斷點 (由處理器控制) 和軟體中斷點 (由偵錯工具控制)。 處理器斷點通常設置在程序數據上——這就是它們被稱為“數據斷點”的原因——但它們也可以在可執行代碼上設置。 軟體斷點通常設定在可執行程式碼上,但也可以在程式資料上設定。 不幸的是,在偵錯文獻中,通常會將處理器中斷點稱為「資料中斷點」,即使它們是在可執行程式碼上設定的。
處理器斷點
當存取特定記憶體位置時,會觸發處理器岔斷點。 處理器中斷點有四種類型,對應至觸發它的記憶體存取類型:
| 斷點類型 | 行動 |
|---|---|
| e(執行) | 當處理器從指定位址擷取指令時觸發。 |
| r(讀/寫) | 當處理器在指定位址讀取或寫入記憶體時觸發。 |
| w(寫入) | 當處理器在指定位址寫入記憶體時觸發。 |
| 輸入/輸出 (I/O) | 當存取指定位址的 I/O 連接埠時觸發。 |
每一個處理器岔斷點都有與其相關聯的大小。 例如,可以在大小為四個位元組的位址 0x70001008 設定 w (寫入)處理器斷點。 這將監控從 0x70001008 到 0x7000100B(含)的地址塊。 如果寫入此記憶體區塊,則會觸發中斷點。
處理器可能會在與指定區域重疊但不相同的記憶體區域上執行作業。 在上一段中提供的範例中,包含範圍0x70001000到0x7000100F的單一寫入作業,或僅包含 0x70001009 位元組的寫入作業,將會是重疊作業。 在此狀況下,是否觸發斷點取決於處理器。 如需如何在特定處理器上處理此狀況的詳細資訊,請參閱處理器架構手冊並尋找「除錯暫存器」或「除錯控制暫存器」。 以一種特定的處理器類型為例,在 x86 處理器上,每當存取的範圍與中斷點範圍重疊時,就會觸發讀取或寫入中斷點。
同樣地,如果在位址0x00401003上設定 e (執行) 中斷點,然後執行跨越位址 0x00401002 和 0x00401003 的兩位元組指令,則結果取決於處理器的差異。 同樣,請參閱處理器架構手冊以了解詳細資訊。
處理器會區分使用者模式偵錯工具所設定的中斷點,以及核心模式偵錯工具所設定的中斷點。 使用者模式處理器中斷點不會影響任何核心模式進程。 核心模式處理器中斷點可能會或可能不會影響使用者模式進程,視使用者模式程式代碼是否使用偵錯暫存器狀態,以及是否有附加的使用者模式偵錯工具而定。
若要將目前進程的現有資料中斷點套用至不同的暫存器環境定義,請使用 .apply_dbp (將資料中斷點套用至環境定義) 命令。
在多處理器電腦上,每個處理器岔斷點都會套用至所有處理器。 例如,如果現行處理器是 3,而您使用指令 ba e1 MyAddress 將岔斷點放在 MyAddress 上,則在該位址執行的任何處理器 (不只是處理器 3) 都會觸發岔斷點。 這也適用於軟體斷點。
軟體中斷點
軟體中斷點與處理器中斷點不同,是由偵錯工具控制。 當偵錯工具在某個位置設定軟體中斷點時,它會暫時將該記憶體位置的內容取代為中斷指令。 偵錯工具會記住此位置的原始內容,因此如果偵錯工具中顯示此記憶體,偵錯工具會顯示該記憶體位置的原始內容,而不是中斷指令。 當目標進程在此位置執行程式碼時,break指令會使該進程進入偵錯工具。 執行您選擇的任何動作之後,您可以讓目標繼續執行,而執行將以原本位於該位置的指令繼續執行。
處理器中斷點類型的可用性
i (i/o) 選項只能在核心模式偵錯期間使用。
並非所有資料大小都可以與所有處理器岔斷點類型搭配使用。 允許的大小取決於目標電腦的處理器。 有關詳細信息,請參閱 ba(Break on Access)。
軟體中斷點和處理器中斷點的限制
使用 bp 或 bm /a 指令時,可以指定資料位址而非程式位址。 不過,即使指定了資料位置,這些命令也會建立軟體岔斷點,而不是處理器岔斷點。 當偵錯工具將軟體中斷點放在某個位置時,它會暫時以中斷指令取代該記憶體位置的內容。 這不會損毀可執行檔映像,因為偵錯工具會記住此位置的原始內容,而且當目標進程嘗試執行此程式代碼時,偵錯工具可以適當地回應。 但是,當在資料位置設定軟體中斷點時,產生的覆寫可能會導致資料損毀。 因此,只有在您確定此位置只會用作可執行程式碼時,才會在資料位置上設定軟體中斷點是安全的。
bp、bu及 bm 指令會以中斷指令取代處理器指令來設定軟體岔斷點。 因此,這些不能用於唯讀程式碼或任何其他無法改寫的程式碼。 若要在這類程式碼中設定中斷點,您必須使用 ba (Break on Access) 搭配 e (execute) 選項。
您無法在相同位址建立多個處理器岔斷點,這些岔斷點僅在觸發岔斷點時自動執行的指令不同。 不過,您可以在相同的位址建立多個岔斷點,這些岔斷點的其他限制不同 (例如,您可以使用具有不同值的 /p、/t、/c 及 /C 選項的 ba 命令,在相同位址建立多個岔斷點)。
使用者模式進程中的初始中斷點 (通常設定在 main 函式或其對等函式) 上,不能是處理器中斷點。
支援的處理器岔斷點數目取決於目標處理器架構。
控制程式斷點和處理器斷點
可以使用 bp (設定中斷點)、bm (設定符號中斷點) 和 bu (設定未解析的中斷點) 指令來建立軟體中斷點。 可以使用 ba (Break on Access) 指令來建立處理器岔斷點。 停用、啟用及修改岔斷點的命令會套用至所有種類的岔斷點。 顯示岔斷點清單的指令包括所有岔斷點,並指出每一個岔斷點的類型。 如需這些命令的清單,請參閱 控制岔斷點的方法。
[WinDbg 中斷點] 對話方塊會顯示所有中斷點,指出處理器中斷點,並表示表示法為 “e”、“r”、“w” 或 “i” ,後面接著區塊的大小。 此對話框可用來修改任何中斷點。 此對話方塊上的 [命令] 文字方塊可用來建立任何類型的中斷點。如果需要處理器岔斷點,請以 “ba” 開始輸入。 當您在 WinDbg 反組譯視窗 或 來源視窗中使用滑鼠來設定中斷點時,偵錯工具會建立未解析的軟體中斷點。
處理器岔斷點會儲存在處理器的偵錯暫存器中。 您可以手動編輯除錯暫存器值來設定岔斷點,但強烈建議不要這樣做。