當您在使用者模式中偵錯目標應用程式或核心模式中的目標電腦時,目標可以 執行 或 停止。
當調試程式連線到內核模式目標時,調試程式會離開目標執行,除非您使用 -b命令行選項,否則目標系統已停止回應(也就是 當機),或目標系統仍然因為先前的核心偵錯動作而停止。
當調試程式啟動或連線到使用者模式目標時,調試程式會立即停止目標,除非您使用 -g 命令行選項。 如需詳細資訊,請參閱 初始斷點。
當目標正在執行時
當目標執行時,大部分的調試程式動作都無法使用。
如果您想要停止執行中的目標,您可以發出 Break 命令。 這個指令會使除錯程式 進入目標。 也就是說,除錯工具會停止目標,並將所有控制權交給除錯工具。 應用程式可能不會立即中斷。 例如,如果所有線程目前正在執行系統程式代碼,或處於等候作業中,則應用程式只會在控件傳回至應用程式的程式碼之後中斷。
如果執行中的目標遇到例外狀況、如果發生某些 事件、如果斷點 被觸發 或如果應用程式正常關閉,則目標 進入除錯程式。 此動作會停止目標,並將所有控件提供給調試程式。 在 除錯器命令視窗中會出現一則訊息, 並描述錯誤、事件或斷點。
當目標停止時
若要啟動或控制目標的執行,您可以執行下列動作:
若要讓應用程式開始執行,請發出 Go 命令。
若要逐一逐步執行應用程式,請使用 Step Into 或 Step Over 命令。 如果發生函數呼叫,Step Into 進入該函式並繼續逐步執行每個指令。 越過 將函式呼叫視為單一步驟。 當調試程式處於 組合語言模式時,逐步執行會一次執行一條機器指令。 當除錯器處於 來源模式時,每次將逐行執行來源代碼。
若要完成目前的函式,並在傳回發生時停止,請使用 Step Out 或 追踪與監視 命令。 Step Out 命令會繼續執行,直到目前的函式結束為止。 追蹤和監看功能 將繼續,直到目前的函式結束,並且也會顯示函式呼叫的完整摘要。 不過,您必須在相關函式的第一個指令上發出 追蹤和監看 命令。
如果發生例外狀況,您可以使用 Go 搭配例外狀況已處理 命令,或使用 Go 搭配例外狀況未處理 命令,繼續執行並控制例外狀況的狀態。 (如需例外狀況的詳細資訊,請參閱 控制例外狀況和事件。
(僅限 WinDbg)如果您在 [反組譯碼] 視窗中選取一行 或 [來源] 視窗,然後使用 Run to Cursor 命令,程式就會執行,直到它遇到選取的行為止。
(僅限使用者模式)若要關閉目標應用程式並從頭重新啟動,請使用 [重新啟動 ] 命令。 您只能搭配調試程式建立的進程使用此命令。 重新啟動程序之後,它會立即中斷至調試程式。
(僅限 WinDbg)若要關閉目標應用程式並清除調試程式,請使用 [停止偵錯] 命令。 此命令可讓您開始偵錯不同的目標。
命令表單
啟動或控制目標執行的大部分命令都以文字命令、功能表命令、工具列按鈕和快捷鍵的形式存在。 身為基本文字命令,您可以在CDB、KD或 WinDbg 中使用這些命令。 (命令的文字形式經常支援其他選項,例如變更程式計數器的位置,或執行固定數目的指令。您可以使用 WinDbg 中的選單命令、工具列按鈕和快捷鍵。
您可以使用下列格式的命令。
| 指令 | 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 秒。