bp、bu、bm (設定中斷點)

bpbubm命令會設定一或多個軟體中斷點。 您可以結合位置、條件和選項來設定不同類型的軟體中斷點。

User-Mode

[~Thread] bp[ID] [Options] [Address [Passes]] ["CommandString"] 
[~Thread] bu[ID] [Options] [Address [Passes]] ["CommandString"] 
[~Thread] bm [Options] SymbolPattern [Passes] ["CommandString"]

Kernel-Mode

bp[ID] [Options] [Address [Passes]] ["CommandString"] 
bu[ID] [Options] [Address [Passes]] ["CommandString"] 
bm [Options] SymbolPattern [Passes] ["CommandString"]

參數

執行緒
指定中斷點所套用的執行緒。 如需語法的詳細資訊,請參閱 執行緒語法。 您只能在使用者模式中指定執行緒。 如果您未指定執行緒,中斷點會套用至所有線程。

Id
指定識別中斷點的十進位數。

偵錯工具會在建立中斷點時指派 識別碼 ,但您可以使用 br (中斷點 Renumber) 命令加以變更。 您可以使用 識別碼 ,在稍後的偵錯工具命令中參考中斷點。 若要顯示中斷點的 識別碼 ,請使用 bl (中斷點清單) 命令。

當您在命令中使用 識別碼 時,請勿在命令 (bpbu) 和識別碼之間輸入空格。

ID參數一律是選擇性的。 如果您未指定 識別碼,偵錯工具會使用第一個可用的中斷點號碼。 在核心模式中,您只能設定 32 個中斷點。 在使用者模式中,您可以設定任意數目的中斷點。 不論是哪一種情況,識別碼的值都沒有限制。 如果您 以方 括弧括住識別碼 ([]) , 則 ID 可以包含任何運算式。 如需語法的詳細資訊,請參閱 數值運算式語法

選項 指定中斷點選項。 您可以指定下列選項的任意數目,但如下所述:

/1
建立「單次」中斷點。 觸發此中斷點之後,它會從中斷點清單中刪除。

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

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

/cMaxCallStackDepth
只有在呼叫堆疊深度小於 MaxCallStackDepth時,才會啟動中斷點。 您無法搭配 /C使用此選項。

/CMinCallStackDepth
只有在呼叫堆疊深度大於 MinCallStackDepth時,才會啟動中斷點。 您無法搭配 /c使用此選項。

/a
(針對 bm 僅) 在所有指定位置上設定中斷點,無論是在資料空間或程式碼空間中。 由於資料上的中斷點可能會導致程式失敗,因此請只在已知為安全的位置上使用此選項。

/D
(僅適用于 bm) 將中斷點位置轉換為位址。 因此,如果移動程式碼,中斷點會維持在相同的位址,而不是根據 SymbolPattern進行設定。 使用 /d 以避免在載入或卸載模組時重新評估中斷點的變更。

/(
(只有 bm) SymbolString 所定義的符號字串中包含參數清單資訊。

此功能可讓您在具有相同名稱但不同參數清單的多載函式上設定中斷點。 例如,bm / ( myFunc 會在 myFunc (int a) myFunc (char a) 。 如果沒有 「/ (」, 在 myFunc 上設定的中斷點會失敗,因為它不會指出中斷點所要使用的 myFunc 函式。

/w dx 物件運算式 根據 dx 物件運算式所傳回的布林值,設定條件中斷點。 引數是 (dx) 運算式的資料模型,評估為 true (符合條件 – 中斷) 或 false (不符合條件 – 不中斷) 。

此範例會根據 localVariable 的值來設定條件中斷點。

bp /w "localVariable == 4" mymodule!myfunction

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

bp /w "@$scriptContents.myFunc(localVariable)" @rip

如需偵錯工具物件的詳細資訊,請參閱 dx (顯示偵錯工具物件模型運算式)

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

位址
指定設定中斷點之指令的第一個位元組。 如果您省略 Address,則會使用目前的指令指標。 如需語法的詳細資訊,請參閱 位址和位址範圍語法

通過
指定啟動中斷點的執行傳遞數目。 偵錯工具會略過中斷點位置,直到到達指定的階段為止。 Passes的值可以是任何 16 位或 32 位值。

根據預設,中斷點會在應用程式第一次執行包含中斷點位置的程式碼時作用中。 此預設情況相當於傳遞的值為1。 若要只在應用程式執行程式碼至少一次之後啟動中斷點,請輸入 值 2 或更多。 例如,值 2 會在第二次執行程式碼時啟動中斷點。

此參數會建立遞減每個通過程式碼的計數器。 若要查看 傳遞 計數器的初始和目前值,請使用 bl (中斷點清單)

只有在應用程式執行超過中斷點以回應g (Go) 命令時,才會遞減傳遞計數器。 如果您要逐步執行程式碼或追蹤,則計數器不會遞減。 當 傳遞 計數器達到 1時,您只能藉由清除並重設中斷點來重設它。

CommandString
指定每次遇到中斷點次數時所執行的命令清單。 您必須以引號括住 CommandString 參數。 使用分號分隔多個命令。

CommandString中的偵錯工具命令可以包含參數。 您可以使用標準 C 控制字元 (,例如 \n\「) 。 包含在第二層引號中的分號 (\「) 會解譯為內嵌引號字串的一部分。

只有在應用程式執行時達到中斷點,才能執行CommandString命令,以回應g (Go) 命令。 如果您要逐步執行程式碼或追蹤超過這個點,則不會執行命令。

在中斷點之後繼續執行程式的任何命令 (例如 gt) 結束命令清單的執行。

SymbolPattern
指定模式。 偵錯工具會嘗試將此模式與現有的符號相符,並在所有模式相符專案上設定中斷點。 SymbolPattern 可以包含各種萬用字元和規範。 如需此語法的詳細資訊,請參閱 字串萬用字元語法。 因為這些字元會比對符號,所以比對不會區分大小寫,而且單一前置底線 (_) 代表任何數量的前置底線。

環境

項目 描述
模式 使用者模式、核心模式
目標 僅限即時偵錯
平台 all

其他資訊

如需如何使用中斷點、控制中斷點的其他中斷點命令和方法,以及如何從核心偵錯工具在使用者空間中設定中斷點的詳細資訊,請參閱 使用中斷點。 如需條件中斷點的詳細資訊,請參閱 設定條件式中斷點

備註

bpbubm命令會設定新的中斷點,但它們有不同的特性:

  • bp (設定中斷點) 命令會在命令中指定的中斷點位置位址設定新的中斷點。 如果偵錯工具無法在設定中斷點時解析中斷點位置的位址運算式, bp 中斷點會自動轉換成 bu 中斷點。 使用 bp 命令來建立當模組卸載時不再作用中的中斷點。

  • bu (設定未解析的中斷點) 命令會設定延後未解析的中斷點。 bu中斷點是在命令中指定的中斷點位置符號參考上設定, (不在位址上) ,而且每當解析具有參考的模組時,就會啟動。 如需這些中斷點的詳細資訊,請參閱 無法解析的中斷點 (bu 中斷點)

  • bm (設定符號中斷點) 命令會在符合指定模式的符號上設定新的中斷點。 此命令可以建立多個中斷點。 根據預設,比對模式之後, bm 中斷點會與 bu 中斷點相同。 也就是說,在符號參考上設定 的 bm 中斷點會延後中斷點。 不過,bm /d 命令會建立一或多個 bp 中斷點。 每個中斷點都會在相符位置的位址上設定,而且不會追蹤模組狀態。

如果您不確定用來設定現有中斷點的命令,請使用 .bpcmds (顯示中斷點命令) 列出所有中斷點,以及用來建立中斷點的命令。

bp中斷點與bu中斷點之間有三個主要差異:

  • bp中斷點位置一律會轉換成位址。 如果模組變更移動 設定 bp 中斷點的程式碼,中斷點會維持在相同的位址。 另一方面, bu 中斷點仍與符號值相關聯, (一般是符號加上已使用之位移) ,即使其位址變更,也會追蹤此符號位置。

  • 如果在載入的模組中找到 bp 中斷點位址,而且稍後卸載該模組,則會從中斷點清單中移除中斷點。 另一方面, bu 中斷點會在重複卸載和載入之後持續存在。

  • 您以 bp 設定的中斷點不會儲存在 WinDbg 工作區中。 使用 bu 設定的中斷點會儲存在工作區中。

當您想要在中斷點的符號模式中使用萬用字元時, bm 命令很有用。 bmSymbolPattern語法相當於使用x SymbolPattern,然後在每個結果上使用bu。 例如,若要在開頭為 「mem」 字串的 Myprogram 模組中的所有符號上設定中斷點,請使用下列命令。

範例

0:000> bm myprogram!mem* 
  4: 0040d070 MyProgram!memcpy
 5: 0040c560 MyProgram!memmove
  6: 00408960 MyProgram!memset

因為 bm 命令會設定軟體中斷點, (不是處理器中斷點) ,所以它會在設定中斷點以避免損毀資料時自動排除資料位置。

使用 bp 或 bm /a 命令時,可以指定資料位址,而不是程式位址。 不過,即使指定資料位置,這些命令仍會建立軟體中斷點,而不是處理器中斷點。 如果軟體中斷點放在程式資料中,而不是可執行檔程式碼,可能會導致資料損毀。 因此,只有在確定儲存在該位置的記憶體會當做可執行程式碼使用,而不是程式資料時,才應該在資料位置使用這些命令。 否則,您應該改用 ba (Break on Access) 命令。 如需詳細資訊,請參閱 處理器中斷點 (ba 中斷點)

如需有關如何在更複雜的語法所指定位置上設定中斷點的詳細資訊,例如 C++ 公用類別的成員,或包含其他限制字元的任意文字字串,請參閱 中斷點語法

如果單一邏輯來源行跨越多個實體行,中斷點會設定在語句或呼叫的最後一個實體行上。 如果偵錯工具無法在要求的位置設定中斷點,它會將中斷點放在下一個允許的位置。

如果您指定 Thread,則會在指定的執行緒上設定中斷點。 例如, ~*bp 命令會在所有線程上設定中斷點, ~#bp 在造成目前例外狀況的執行緒上設定中斷點, 而 ~123bp 會線上程 123 上設定中斷點。 ~bp~.bp命令會在目前的執行緒上設定中斷點。

當您在核心模式中偵錯多處理器系統時,您可以使用 bp 或 ba 設定的中斷點 , (Access 上的中斷) 套用至所有處理器。 例如,如果目前的處理器是 3,而且您輸入 bp MemoryAddress 將中斷點放在 MemoryAddress。 任何在該位址上執行的處理器 (不只執行處理器 3) 都會造成中斷點陷阱。

bpbubm命令會藉由將處理器指令取代為中斷點來設定軟體中斷點。 若要偵錯無法變更的唯讀程式碼或程式碼,請使用 ba e 命令,其中 e 代表僅限執行存取。

下列命令會設定超過 MyTest函式開頭的中斷點 12 個位元組。 前六個通過程式碼時會忽略這個中斷點,但執行會在第七個通過程式碼時停止。

0:000> bp MyTest+0xb 7 

下列命令會在 RtlRaiseException設定中斷點、顯示 eax 暫存器、顯示符號 MyVar的值,並繼續。

kd> bp ntdll!RtlRaiseException "r eax; dt MyVar; g"

下列兩 個 bm 命令會設定三個中斷點。 執行命令時,顯示的結果不會區分以 /d 參數建立的中斷點,以及未建立的中斷點。 .bpcmds (顯示中斷點命令) 可用來區分這兩種類型。 如果中斷點是由沒有/d參數的bm所建立,.bpcmds顯示會以bu表示中斷點類型,後面接著以@!「」標記括住的評估符號, (表示它是常值符號,而不是數值運算式或註冊) 。 如果中斷點是由 bm 使用 /d 參數所建立, .bpcmds 顯示會以 bp表示中斷點類型。

0:000> bm myprog!openf* 
  0: 00421200 @!"myprog!openFile"
  1: 00427800 @!"myprog!openFilter"

0:000> bm /d myprog!closef* 
  2: 00421600 @!"myprog!closeFile"

0:000> .bpcmds
bu0 @!"myprog!openFile";
bu1 @!"myprog!openFilter";
bp2 0x00421600 ;