處理器斷點 (ba 斷點)

在調試程式要求下由處理器控制的斷點稱為處理器斷點或數據斷點。 調試程式直接控制的斷點稱為 軟體斷點

注意 雖然數據斷點一詞通常用來做為處理器斷點同義字,但此字詞可能會產生誤導。 斷點有兩種基本類型:處理器斷點,由處理器控制,軟體斷點由調試程式控制。 處理器斷點通常會在程式數據上設定-這是它們稱為「數據斷點」的原因,但也可以在可執行的程式代碼上設定。 軟體斷點通常會在可執行的程式代碼上設定,但也可以在程式數據上設定。 可惜的是,偵錯文學中通常會將處理器斷點稱為「數據斷點」,即使它們是在可執行程式碼上設定也一樣。

處理器斷點

存取特定記憶體位置時,會觸發處理器斷點。 處理器斷點有四種類型,對應至觸發它的記憶體取類型:

斷點類型 動作
e (execute) 當處理器從指定的位址擷取指令時觸發。
r (讀取/寫入) 當處理器在指定位址讀取或寫入記憶體時觸發。
w (寫入) 當處理器在指定位址寫入記憶體時觸發。
i (i/o) 在存取指定位址的 I/O 埠時觸發。

每個處理器斷點都有與其相關聯的大小。 例如, w (write) 處理器斷點可以在位址0x70001008設定,大小為四個字節。 這會監視位址區塊,從0x70001008到包含0x7000100B。 如果寫入此記憶體區塊,將會觸發斷點。

處理器會在與指定區域重疊但與指定區域不相同之內存區域上執行作業。 在上一段中提供的範例中,包含0x7000100F範圍0x70001000的單一寫入作業,或只包含0x70001009位元組的寫入作業,會是重疊的作業。 在這種情況下,觸發斷點是否與處理器相關。 如需特定處理器如何處理這種情況的詳細數據,請參閱處理器架構手冊,並尋找「偵錯緩存器」或「偵錯控制緩存器」。 若要以一個特定的處理器類型為例,在 x86 處理器上,每當存取的範圍重迭斷點範圍時,就會觸發讀取或寫入斷點。

同樣地,如果在 位址0x00401003上設定 e (execute) 斷點,然後執行跨越位址的雙位元組指令0x00401002並執行0x00401003,則結果會與處理器相依。 同樣地,如需詳細資訊,請參閱處理器架構手冊。

處理器會區分使用者模式調試程式所設定的斷點,以及內核模式調試程式所設定的斷點。 使用者模式處理器斷點不會影響任何內核模式進程。 核心模式處理器斷點可能會或不會影響使用者模式進程,視使用者模式程序代碼是否使用偵錯緩存器狀態,以及是否有附加的使用者模式調試程式而定。

若要將目前進程的現有數據斷點套用至不同的緩存器內容,請使用 .apply_dbp (將數據斷點套用至內容) 命令。

在多處理器計算機上,每個處理器斷點都會套用至所有處理器。 例如,如果目前的處理器是 3,而且您使用 命令 ba e1 MyAddress 將斷點 放在 MyAddress,則任何處理器 -- 不只執行於該地址的處理器 3 -- 會觸發斷點。 這也會保留軟體斷點。

軟體斷點

與處理器斷點不同的軟體斷點是由調試程式所控制。 當調試程式在某個位置設定軟體斷點時,它會以中斷指令暫時取代該記憶體位置的內容。 調試程式會記住這個位置的原始內容,因此,如果這個記憶體顯示在調試程式中,調試程式將會顯示該記憶體位置的原始內容,而不是中斷指令。 當目標進程在此位置執行程序代碼時,中斷指令會導致進程中斷至調試程式。 在您執行任何您選擇的動作之後,可能會導致目標繼續執行,而執行將會隨著原本在該位置中的指令繼續執行。

處理器斷點類型的可用性

i (i/o) 選項只能在內核模式偵錯期間使用。

並非所有的數據大小都可以與所有處理器斷點類型搭配使用。 允許的大小取決於目標計算機的處理器。 如需詳細資訊,請參閱 ba (Access 上的中斷)

軟體斷點和處理器斷點的限制

使用 bp 或 bm /a 命令時,可以指定資料位址,而不是程式位址。 不過,即使指定數據位置,這些命令也會建立軟體斷點,而不是處理器斷點。 當調試程式將軟體斷點放在某個位置時,它會以中斷指令暫時取代該記憶體位置的內容。 這不會損毀可執行檔映像,因為調試程式會記住這個位置的原始內容,而且當目標進程嘗試執行此程式碼時,調試程式可以適當地回應。 但是,在數據位置設定軟體斷點時,產生的覆寫可能會導致數據損毀。 因此,只有在您確定此位置只做為可執行程式代碼時,才會在數據位置上設定軟體斷點是安全的。

bpbubm 命令會藉由以中斷指令取代處理器指令來設定軟體斷點。 因此,這些無法用於唯讀程式代碼或任何其他無法覆寫的程序代碼。 若要在這類程式代碼中設定斷點,您必須使用 ba (Break on Access) 搭配 e (execute) 選項。

您無法在相同位址建立多個處理器斷點,而該斷點只會在觸發斷點時自動執行的命令中執行。 不過,您可以在不同其他限制的相同位址建立多個斷點(例如,您可以使用ba命令搭配 /p、/t/c 和 /C 選項的不同值,在同一個位址建立多個斷點。

使用者模式進程的初始斷點(通常是在main函式或其對等項目上設定)不能是處理器斷點。

支援的處理器斷點數目取決於目標處理器架構。

控制軟體斷點和處理器斷點

您可以使用 bp(設定斷點)bm(設定符號斷點)bu (設定未解析的斷點) 命令來建立軟體斷點。 您可以使用 ba (Break on Access) 命令來建立處理器斷點。 停用、啟用和修改斷點的命令會套用至所有類型的斷點。 顯示斷點清單的命令包含所有斷點,並指出每個斷點的類型。 如需這些命令的清單,請參閱 控制斷點的方法。

[WinDbg 斷點 ] 對話框會顯示所有斷點,指出表示法為 “e”、“r”、“w” 或 “i' 的處理器斷點,後面接著區塊的大小。 此對話框可用來修改任何斷點。 此 對話方塊上的 [命令 ] 文字框可用來建立任何類型的斷點。如果需要處理器斷點,請使用 「ba」 開始輸入。 當您在 WinDbg 反組譯碼視窗或 [來源] 視窗中使用滑鼠設定斷點時,調試程式會建立未解析的軟體斷點。

處理器斷點會儲存在處理器的偵錯緩存器中。 您可以手動編輯偵錯緩存器值來設定斷點,但強烈建議您不要這樣做。