控制目標
當您在使用者模式中偵錯目標應用程式或核心模式中的目標計算機時,目標可以 執行 或 停止。
當調試程式連線到內核模式目標時,調試程式會離開目標執行,除非您使用 -b 命令行選項,否則目標系統已停止回應(也就是 當機),或目標系統仍然因為先前的核心偵錯動作而停止。
當調試程式啟動或連線到使用者模式目標時,調試程式會立即停止目標,除非您使用 -g 命令行選項。 如需詳細資訊,請參閱 初始斷點。
當目標正在執行時
當目標執行時,大部分的調試程式動作都無法使用。
如果您想要停止執行中的目標,您可以發出 Break 命令。 此命令會使調試程式 進入目標。 也就是說,調試程式會停止目標,並將所有控件提供給調試程式。 應用程式可能不會立即中斷。 例如,如果所有線程目前正在執行系統程式代碼,或處於等候作業中,則應用程式只會在控件傳回至應用程式的程式碼之後中斷。
如果執行中的目標遇到例外狀況,如果發生特定事件、叫用斷點,或應用程式正常關閉,則目標會中斷至調試程式。 此動作會停止目標,並將所有控件提供給調試程式。 [調試程式命令] 視窗中會出現一則訊息,並描述錯誤、事件或斷點。
當目標停止時
若要啟動或控制目標的執行,您可以執行下列動作:
若要讓應用程式開始執行,請發出 Go 命令。
若要一次逐步執行應用程式一個指令,請使用 [逐步執行] 或 [逐步執行] 命令。 如果函式呼叫發生, 逐步 執行會輸入函式,並繼續逐步執行每個指令。 Step Over 會將函式呼叫視為單一步驟。 當調試程式處於 元件模式時,逐步執行一次會發生一個機器指令。 當調試程式處於 來源模式時,逐步執行一次會發生一個來源行。
若要完成目前的函式,並在傳回發生時停止,請使用 Step Out 或 Trace 和 Watch 命令。 Step Out 命令會繼續執行,直到目前的函式結束為止。 追蹤和監看 會繼續進行,直到目前的函式結束,並也會顯示函式呼叫的摘要。 不過,您必須在有問題的函式第一個指令上發出 Trace 和 Watch 命令。
如果發生例外狀況,您可以使用 Go 與 Exception Handled 和 Go with Exception Not Handled 命令繼續執行,並控制例外狀況的狀態。 (如需例外狀況的詳細資訊,請參閱 控制例外狀況和事件。
(僅限 WinDbg)如果您在 [反組譯碼] 視窗或 [來源] 視窗中選取一行,然後使用 [執行至數據指標] 命令,程式就會執行,直到遇到選取的行為止。
(僅限使用者模式)若要關閉目標應用程式並從頭重新啟動,請使用 [重新啟動] 命令。 您只能搭配調試程式建立的進程使用此命令。 重新啟動進程之後,它會立即中斷至調試程式。
(僅限 WinDbg)若要關閉目標應用程式並清除調試程式,請使用 [ 停止偵錯] 命令。 此命令可讓您開始偵錯不同的目標。
命令表單
啟動或控制目標執行的大部分命令都以文字命令、功能表命令、工具列按鈕和快捷鍵的形式存在。 身為基本文字命令,您可以在CDB、KD或 WinDbg 中使用這些命令。 (命令的文字形式經常支援其他選項,例如變更程式計數器的位置,或執行固定數目的指令。您可以使用 WinDbg 中的選單命令、工具列按鈕和快捷鍵。
您可以使用下列表單中的命令。
Command | WinDbg 命令 | WinDbg 快速鍵 | 效果 |
---|---|---|---|
偵錯 |執行至數據指標 |
F7 CTRL + F10 |
(僅限 WinDbg)執行,直到到達游標標記的行為止。 |
|
偵錯 |停止偵錯 |
SHIFT + F5 |
停止所有偵錯並關閉目標。 |
|
(僅限 CDB/KD) CTRL+C |
偵錯 |破 |
CTRL + BREAK |
執行會停止,而調試程式會中斷至目標。 |
偵錯 |重新啟動 |
CTRL + SHIFT + F5 |
(僅限使用者模式)重新啟動目標應用程式。 |
|
偵錯 |去 |
F5 |
目標會自由執行。 |
|
在條件斷點之後繼續執行。 |
|||
偵錯 |Go 已處理例外狀況 |
與 g (Go) 相同,不同之處在於目前的例外狀況會被視為已處理。 |
||
偵錯 |移至未處理的例外狀況 |
與 g (Go) 相同,不同之處在於目前的例外狀況會被視為未處理。 |
||
偵錯 |跳出 |
SHIFT + F11 |
目標會執行,直到目前的函式完成為止。 |
|
偵錯 |逐步執行 |
F10 |
目標會執行一個指令。 如果此指令是函數調用,該函式會以單一步驟執行。 |
|
目標會執行,直到到達指定的地址為止。 此函式中的所有步驟都會顯示(但未顯示呼叫函式中的步驟)。 |
|||
目標會執行到下一個 呼叫 指令為止。 如果目前的指令是 呼叫 指令,則會完全執行此呼叫,並繼續執行,直到下一個 呼叫為止。 |
|||
目標會執行,直到到達 呼叫 指令或傳 回 指令為止。 |
|||
目標會執行,直到達到任何類型的分支指令,包括條件式或無條件分支、呼叫、傳回和系統呼叫。 |
|||
目標會執行,直到到達傳 回 指令為止。 |
|||
偵錯 |逐步執行 |
F11 F8 |
目標會執行一個指令。 如果這個指令是函數調用,調試程式會追蹤該呼叫。 |
|
目標會執行,直到到達指定的地址為止。 會顯示此函式和呼叫函式中的所有步驟。 |
|||
(除了核心模式以外的所有模式,只在 x86 型系統上)目標會執行,直到到達下一個分支指令為止。 |
|||
目標會執行到下一個 呼叫 指令為止。 如果目前的指令是 呼叫 指令,則會追蹤指令,直到到達新的 呼叫 為止。 |
|||
目標會執行,直到到達呼叫指令或傳回指令為止。 如果目前的指令是呼叫指令或傳回指令,則會追蹤指令直到到達新的呼叫或傳回為止。 |
|||
目標會執行,直到達到任何類型的分支指令,包括條件式或無條件分支、呼叫、傳回和系統呼叫。 如果目前的指令是分支指令,則會追蹤指令,直到到達新的分支指令為止。 |
|||
目標會執行,直到到達傳 回 指令為止。 如果目前的指令是 傳回 指令,則會追蹤指令,直到到達新的 傳回 為止。 |
|||
目標會執行到整個指定函式完成為止。 接著會顯示統計數據。 |
如需如何重新啟動目標計算機的詳細資訊,請參閱 當機和重新啟動目標計算機。
命令列選項
如果您不希望應用程式在啟動或載入時立即停止,請使用CDB或WinDbg搭配 -g 命令行選項。 如需這種情況的詳細資訊,請參閱 初始斷點。
CDB 和 WinDbg 也支援 -G 命令行選項。 如果應用程式正確完成,此選項會使偵錯會話結束。
下列命令會嘗試從頭到尾執行應用程式,而且調試程式提示只會在發生錯誤時出現。
cdb -g -G ApplicationName
您可以使用 -pt 命令列選項 來設定中斷逾時。在某些情況下,可能會使目標無法與調試程序通訊。 如果發出中斷命令,而且調試程式在此時間後無法中斷目標,調試程式會顯示「中斷逾時」訊息。
此時,調試程式會停止嘗試闖入目標。 相反地,調試程式會暫停目標,並可讓您檢查目標應用程式(但無法控制)。
默認逾時為 30 秒。