執行直到達到指定狀態為止
有數種方式會導致目標執行,直到達到指定的狀態為止。
使用中斷點來控制執行
其中一種方法是使用中斷點。 當程式計數器到達指定的位址時,最簡單的中斷點會停止執行。 更複雜的中斷點可以:
只有在特定執行緒執行此位址時,才會觸發
允許在觸發之前通過這個位址的指定數目,
會在觸發時自動發出指定的命令,或
watch非可執行記憶體中的指定位址,在讀取或寫入該記憶體時觸發。
如需如何設定及控制中斷點的詳細資訊,請參閱 使用中斷點。
在達到指定狀態之前,執行的方法更為複雜,就是使用 條件中斷點。 這種中斷點是在特定位址設定,但只有在指定的條件保留時才會觸發。 如需詳細資訊,請參閱 設定條件式中斷點。
中斷點和 Pseudo-Registers
在指定所需狀態時,使用 自動虛擬緩存器通常很有説明。 這些是偵錯工具所控制的變數,可讓您參考與目標狀態相關的各種值。
例如,下列中斷點會使用虛擬緩存 器$thread ,這一律等於目前線程的值。 它會在命令中使用時解析為目前線程的值。 藉由使用$thread作為bp (Set Breakpoint) 命令之/t參數的引數,您可以建立每次發出bp命令時,執行緒呼叫NtOpenFile時都會觸發的中斷點:
kd> bp /t @$thread nt!ntopenfile
當任何其他執行緒呼叫 NtOpenFile時,將不會觸發此中斷點。
如需自動虛擬暫存器的清單,請參閱 虛擬暫存器語法。
使用腳本檔案來控制執行
在達到指定狀態之前執行的另一種方式是建立以遞迴方式呼叫本身的腳本檔案,在每個反復專案中測試所需的狀態。
一般而言,此腳本檔案會包含 .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 批註) 命令會將訊息列印到偵錯工具命令視窗,然後執行停止。
如需腳本檔案的詳細資訊,請參閱 使用腳本檔案 和使用 偵錯工具命令程式。
模棱兩可的中斷點解析
在偵錯工具引擎的 10.0.25310.1001 版和更新版本中,現在支援模棱兩可的中斷點解析。 模棱兩可的中斷點可讓偵錯工具在特定案例中設定中斷點,其中中斷點運算式解析為多個位置。 如需詳細資訊,請參閱 模棱兩可的中斷點解析。