共用方式為


執行直到達到指定狀態為止

有數種方式可讓目標執行,直到達到指定的狀態為止。

使用斷點來控制執行

其中一種方法是使用斷點。 當程式計數器到達指定的位址時,最簡單的斷點會停止執行。 更複雜的斷點可以:

  • 只有在特定線程執行此位址時,才會觸發

  • 允許該位址經過指定次數後才會觸發,

  • 自動在觸發時發出指定的命令,或

  • 在非可執行記憶體中監控指定位址,當讀取或寫入該記憶體時觸發。

如需如何設定及控制斷點的詳細資訊,請參閱 使用斷點

在達到指定狀態之前,執行的方法更為複雜,就是使用 條件斷點。 這種斷點是在特定位址設置,但只有在指定的條件滿足時才會觸發。 如需詳細資訊,請參閱 設定條件斷點

斷點和 Pseudo-Registers

在指定所需狀態時,使用 自動虛擬緩存器通常很有説明。 這些是調試程式所控制的變數,可讓您參考與目標狀態相關的各種值。

例如,下列斷點會使用虛擬緩存器 $thread ,其一律等於目前線程的值。 它在命令中使用時會解析為當前執行緒的值。 透過將 $thread 作為 /t 參數的自變數來使用 bp(設置斷點) 命令,您可以建立一個斷點,使當前線程每次呼叫 NtOpenFile 時都會觸發該斷點,當您發出 bp 命令時該線程是處於活動狀態的。

kd> bp /t @$thread nt!ntopenfile

當任何其他線程呼叫 NtOpenFile 時,都不會觸發此斷點。

自動虛擬暫存器的清單,請參閱 Pseudo-Register 語法

使用腳本檔案來控制執行

另一種執行直到達到指定狀態的方法是建立一個腳本檔案,以遞歸方式呼叫自身,在每次迭代中測試所需狀態。

此腳本檔案通常會包含 .if.else 令牌。 您可以使用 t (Trace) 之類的命令來執行單一步驟,然後測試有問題的條件。

例如,如果您想要在 eax 快取器包含值0x1234之前執行,您可以建立名為 eaxstep 的腳本檔案,其中包含下列這一行:

.if (@eax == 1234) { .echo 1234 } .else { t "$<eaxstep" }

然後,從 [調試程式命令] 視窗發出下列命令:

t "$<eaxstep"

這個 t 命令會執行單一步驟,然後執行引號命令。 此命令恰好是 $< (執行腳本檔案),它會執行 eaxstep 檔案。 腳本檔案會測試 eax 的值、執行 t 命令,然後以遞歸方式呼叫本身。 這會持續進行,直到 eax 暫存器等於 0x1234,此時 .echo (Echo Comment) 命令會將訊息列印至偵錯程式指令視窗,然後執行就會停止。

如需腳本檔的詳細資訊,請參閱 使用腳本檔案 和使用 調試程式命令程式

模棱兩可的斷點解析

在調試程式引擎的 10.0.25310.1001 版和更新版本中,現在支援模棱兩可的斷點解析。 模棱兩可的斷點可讓調試程式在特定斷點表達式解析為多個位置的案例中設定斷點。 如需詳細資訊,請參閱 不明确的斷點解析

另請參閱

使用斷點

斷點語法

bp, bu, bm (設定斷點)

模棱兩可的斷點解析

無法解析的斷點 (bu 斷點)