ba (存取休息)

ba 命令會設定處理器斷點(通常稱為較不精確的數據斷點)。 存取指定的記憶體時,會觸發此斷點。

使用者模式

[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]

內核模式

ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]

參數

Thread
指定斷點所套用的線程。 如需語法的詳細資訊,請參閱 線程語法。 您只能在使用者模式中指定線程。

識別碼
指定可識別斷點的選擇性數位。 如果您未指定 標識碼,則會使用第一個可用的斷點號碼。 您無法在 ba 與識別碼之間新增空白。 每個處理器只支援有限的處理器斷點數目,但標識碼值沒有限制。 如果您以 方括弧 ([]] 括住標識符ID 可以包含任何運算式。 如需語法的詳細資訊,請參閱 數值表達式語法

存取權限
指定滿足斷點的存取類型。 此參數可以是下列其中一個值。

選項 動作

e (execute)

當 CPU 從指定的位址擷取指令時,中斷至調試程式。

r (讀取/寫入)

當 CPU 讀取或寫入指定位址時,會中斷至調試程式。

w (寫入)

當 CPU 寫入指定位址時,會中斷至調試程式。

i (i/o)

(僅限核心模式,僅限 x86 型系統)存取位於指定 位址 的 I/O 埠時,會中斷調試程式。

大小
指定要監視存取的位置大小,以位元組為單位。 在以 x86 為基礎的處理器上,此參數可以是 1、2 或 4。 不過,如果 Access 等於 e,Size 必須是 1。

在 x64 型處理器上,此參數可以是 1、2、4 或 8。 不過,如果 Access 等於 e,Size 必須是 1。

選項 指定斷點選項。 您可以使用下列任何數目的選項,但如所示:

/1
建立「單次」斷點。 觸發此斷點之後,斷點就會從斷點清單中永久移除。

/pEProcess
(僅限核心模式)指定與此斷點相關聯的進程。 EProcess 應該是 EPROCESS 結構的實際位址,而不是 PID。 只有在在此進程的內容中遇到斷點時,才會觸發斷點。

/tEThread
(僅限核心模式)指定與此斷點相關聯的線程。 EThread 應該是 ETHREAD 結構的實際位址,而不是線程標識碼。 只有在此線程的內容中遇到斷點時,才會觸發斷點。 如果您使用 /pEProcess/tEThread ,您可以依任一順序輸入它們。

/cMaxCallStackDepth
只有在呼叫堆疊深度小於 MaxCallStackDepth 時,斷點才會作用中。 您無法將此選項與 /C 結合在一起。

/CMinCallStackDepth
只有在呼叫堆疊深度大於 MinCallStackDepth時,斷點才會作用中。 您無法將此選項與 /c 結合在一起。

/w dx 物件表示式 會根據 dx 物件表示式所傳回的布爾值,設定條件斷點。 自變數是數據模型 (dx) 表示式,其評估為 true(符合條件 – 中斷) 或 false (不符合條件 – 不中斷)。

此範例會根據 globalVariable 的值設定條件斷點。 例如,這可讓存取斷點檢查判斷調試程式是否應該中斷時所寫入的值。

ba w 4 /w "mymodule!globalVariable == 4" mymodule!globalVariable

此範例示範如何使用 JavaScript 設定斷點。

ba w 4 /w "@$scriptContents.myFunc(mymodule!globalVariable)" mymodule!globalVariable

如需調試程式對象的詳細資訊,請參閱 dx (顯示除錯程式物件模型表達式)。

如需條件斷點的詳細資訊,請參閱 設定條件斷點

地址
指定任何有效的位址。 如果應用程式在此位址存取記憶體,調試程式會停止執行,並顯示所有緩存器和旗標的目前值。 此位址必須是位移並適當對齊以符合 Size 參數。 (例如,if 大小 為 4, 地址 必須是 4 的倍數。如果您省略 Address,則會使用目前的指令指標。 如需語法的詳細資訊,請參閱 地址和地址範圍語法

通過
指定斷點在啟動之前傳遞的次數。 這個數位可以是任何16位值。 程式計數器在未中斷的情況下通過這個點的次數,小於這個數位的值。 因此,省略此數位與將它設定為 1 相同。 另請注意,此數位只會計算應用程式 執行 超過此點的時間。 逐步執行或追蹤超過這個點並不算數。 達到完整計數之後,您只能藉由清除和重設斷點來重設這個數位。

CommandString
指定每次遇到斷點時所要執行的命令清單指定次數。 只有在您發出 g (Go) 命令之後,而不是在 t (Trace) 或 p (Step) 命令之後用斷點時,才會執行這些命令。 CommandString 中的調試程式命令可以包含參數。

您必須以引號括住此命令字串,而且應該以分號分隔多個命令。 您可以使用標準 C 控制字元 (例如 \n\“)。 包含在第二層引號 (\“) 中的分號會解譯為內嵌引號字串的一部分。

這是選擇性參數。

Environment

項目 說明
模式 使用者模式、核心模式
目標 僅限即時偵錯
平台 全部

其他資訊

如需處理器斷點的詳細資訊,請參閱處理器斷點(ba 斷點)。 如需使用斷點的詳細資訊和範例、控制斷點的其他斷點命令和方法,以及如何從核心調試程式在用戶空間中設定斷點的相關信息,請參閱 使用斷點。 如需條件斷點的詳細資訊,請參閱 設定條件斷點

備註

調試程式會使用標識碼來參考稍後 bc(斷點清除)bd (斷點停用) be (斷點啟用) 命令中的斷點。

使用 bl (斷點清單) 命令來列出所有現有的斷點、其識別碼及其狀態。

使用 .bpcmds (顯示斷點命令) 命令來列出所有現有的斷點、其標識碼,以及用來建立這些斷點的命令。

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

處理器會在與指定區域重疊但與指定區域不相同之內存區域上執行作業。 在此範例中,包含0x7000100F範圍0x70001000的單一寫入作業,或只包含0x70001009位元組的寫入作業,會是重疊的作業。 在這種情況下,觸發斷點是否與處理器相關。 您應該參閱處理器手冊以取得特定詳細數據。 若要取得一個特定實例,在 x86 處理器上,每當存取的範圍與斷點範圍重疊時,就會觸發讀取或寫入斷點。

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

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

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

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

您無法在同一個位址建立多個處理器斷點,這些斷點只在其 CommandString 值中不同。 不過,您可以在具有相同限制的相同位址建立多個斷點(例如,/p、/t/c 和 /C 選項的不同值)。

如需處理器斷點的詳細資訊,以及適用於它們的其他限制,請參閱處理器斷點(ba 斷點)。

下列範例顯示 ba 命令。 下列命令會設定斷點,以讀取變數 myVar 的 4 個字節。

0:000> ba r4 myVar

下列命令會在具有從 0x3F8 到 0x3FB 位址的所有序列埠上新增斷點。 如果有任何專案讀取或寫入這些埠,就會觸發此斷點。

kd> ba i4 3f8