當您執行使用者模式偵錯時,您會啟動、顯示、凍結、解除凍結、暫停和取消暫停進程和線程。
當前 或 活躍 進程是目前正在偵錯的進程。 同樣地,目前 或 作用中 線程是調試程式目前控制的線程。 許多調試程式命令的動作是由目前進程和線程的身分識別所決定。 目前的進程也會決定調試程式所使用的虛擬位址對應。
偵錯開始時,目前的進程是偵錯工具所附加的進程,或者是導致偵錯工具中斷的例外狀況。 同樣地,目前的線程是調試程式附加至進程或造成例外狀況時作用中的線程。 不過,您可以使用調試程式來變更目前的進程和線程,以及凍結或解除凍結個別線程。
在內核模式偵錯中,進程和線程不受本節中所述的方法所控制。 如需了解在核心模式中如何處理程序和線程的詳細資訊,請參閱 變更內容。
顯示進程和線程
若要顯示進程和線程資訊,您可以使用下列方法:
設定目前的進程和線程
若要變更目前的進程或線程,您可以使用下列方法:
|s (設定當前進程) 命令
~s (設定目前線程) 命令
(僅限 WinDbg)程序和執行緒 視窗
凍結和暫停線程
調試程式可以藉由 暫停線程 線程,或 凍結線程,來變更線程的執行。 這兩個動作的效果有些不同。
每個線程都有一個與它相關聯的暫停計數 和。 如果這個計數是一或更大的,則系統不會執行線程。 如果計數為零或更低,系統會在適當時執行線程。
一般而言,每個線程都有零的暫停計數。 當調試程式附加至進程時,它會將該進程中所有線程的暫停計數遞增一個。 如果調試程式與進程中斷連結,則會將所有暫停計數遞減一個。 當除錯器執行程序時,它會暫時地將所有暫停計數遞減一。
您可以使用下列方法,從除錯程式控制任何線程的暫停計數:
~n (Suspend Thread) 命令會將指定的線程暫止計數遞增一個。
~m (恢復執行緒) 命令會將指定的執行緒暫停計數遞減一。
這些命令最常見的用法是將特定線程的暫停計數從一個提高到兩個。 當偵錯工具執行或從處理程序中分離時,即使該處理程序中的其他執行緒正在執行,該執行緒的暫停計數仍會是 1 並保持暫停狀態。
即使您執行 非侵入式偵錯,您仍可以暫停線程。
調試程式也可以凍結 線程。 此動作類似於以某種方式暫停線程。 不過,「凍結」只是調試程序設定。 在Windows作業系統中,沒有任何機制能辨識此線程與其他線程的任何不同。
根據預設,所有線程都會解除凍結。 當調試程式導致進程執行時,凍結的線程不會執行。 不過,如果調試程式與進程中斷連結,則所有線程都會解除凍結。
若要凍結和解除凍結個別線程,您可以使用下列方法:
~f (凍結線程) 命令會凍結指定的線程。
~u (Unfreeze Thread) 命令解除凍結指定的線程。
在任何情況下,屬於目標程序的線程在除錯器中斷目標時永遠不會執行。 只有在調試程式執行進程或中斷連結時,線程的暫停計數才會影響線程的行為。 凍結狀態只會在調試程式執行進程時影響線程的行為。
其他命令中的線程和進程
您可以在許多其他命令之前新增線程規範或進程規範。 如需詳細資訊,請參閱個別命令主題。
您可以在許多命令和擴充命令之前,新增 ~e (Thread-Specific Command) 限定符。 這個限定符會使命令在指定的線程上執行。 如果您想要將命令套用至多個線程,此限定符特別有用。 例如,下列命令會針對正在偵錯的每個線程重複 !gle 擴充功能命令。
~*e !gle
多個系統
偵錯器可以同時連接到多個目標。 當這些進程包含傾印檔案或在多部計算機上包含即時目標時,調試程式會參考每個動作的系統、進程和線程。 如需這類偵錯的詳細資訊,請參閱 偵錯多個目標。