在核心模式偵錯中,許多進程和線程正在執行,有時也會有用戶會話同時執行。 因此,「虛擬位址0x80002000」或「 eax 緩存器」等片語模棱兩可。 您必須指定能夠理解這類片語的上下文。
除錯程式有五個不同的內容,您可以在偵錯時設定:
會話內容表示預設用戶會話。
進程內容會決定調試程式如何解譯虛擬位址。
使用者模式地址內容幾乎永遠不會直接設定。 當您變更進程內容時,會自動設定此內容。
緩存器內容會決定調試程式如何解譯緩存器,以及控制堆疊追蹤的結果。 此內容也稱為 線程內容,但該字詞並不完全正確。 明確的上下文也是暫存器上下文的一種。 如果您指定明確的內容,則會使用該內容,而不是目前的緩存器內容。
本地環境會決定偵錯工具如何解譯局部變數。 此內容也稱為 範圍。
會話內容
多個登入會話可以同時執行。 每個登入會話都有自己的進程。
!session 擴充功能會顯示所有登入會話,或變更目前的會話內容。
當會話號碼輸入為「-2」時,!sprocess 和 !spoolused 擴充功能會使用會話上下文。
當會話內容變更時,進程內容會自動變更為該會話的作用中進程。
流程背景
每個進程都有自己的頁面目錄,可記錄虛擬位址對應至實體位址的方式。 當行程內的任何線程正在執行時,Windows作系統會使用此頁面目錄來解譯虛擬位址。
在使用者模式偵錯期間,目前的進程會決定進程內容。 調試程式命令、延伸模組和偵錯資訊視窗中使用的虛擬位址會使用目前進程的頁面目錄來解譯。
在內核模式偵錯期間,您可以使用 .process (Set Process Context) 命令來設定進程內容。 使用此命令來選取用來解譯虛擬地址的進程頁面目錄。 設定程序上下文之後,您可以在任何接受位址的命令中使用此上下文。 您甚至可以在此位址設定斷點。 藉由在 .process 命令中包含 /i 選項來指定侵入式偵錯,您也可以使用核心調試程式在用戶空間中設定斷點。
您也可以透過核心除錯器在內核空間函式上使用針對進程的斷點來設定使用者模式斷點。 設定策略性斷點,並等候適當的情境出現。
使用者模式位址內容是進程內容的一部分。 一般而言,您不需要直接設定使用者模式地址內容。 如果您設定進程內容,則使用者模式位址內容會自動變更為處理程式相關頁面數據表的目錄基底。
當您在內核模式偵錯期間設定進程內容時,該進程內容會保留,直到另一個 .process 命令變更內容為止。 使用者模式地址內容也會保留,直到 .process 或 .context 命令變更為止。 當目標計算機執行時,這些內容不會變更,而且不會受到註冊內容或本機內容變更的影響。
註冊上下文
每個線程都有自己的緩存器值。 當線程執行時,這些值會儲存在 CPU 快取器中,並在另一個線程執行時儲存在記憶體中。
在使用者模式偵錯期間,當前執行緒通常會決定暫存器內容。 調試器命令、延伸模組和偵錯資訊視窗中對暫存器的任何參考,會根據目前線程的暫存器來解釋。
當您執行使用者模式偵錯時,您可以使用下列其中一個命令,將快取器內容變更為目前線程以外的值:
在內核模式偵錯期間,您可以使用各種調試程式命令來控制緩存器內容,包括下列命令:
這些命令不會變更 CPU 快取器的值。 相反地,調試程式會從記憶體中的位置擷取指定的暫存器內容。 實際上,調試程式只能擷取 已儲存 的緩存器值。 (其他值會動態設定,且不會儲存。 儲存的值就足以重新建立堆疊追蹤。
在設置暫存器內容之後,新的暫存器內容會用於任何使用暫存器值的命令,例如 k(顯示堆疊回溯) 和 r(暫存器)。
不過,當您偵錯多處理器計算機時,某些命令可讓您指定處理器。 (如需這類命令的詳細資訊,請參閱 多處理器語法。如果您為命令指定處理器,則命令會在指定的處理器上使用使用中線程的緩存器內容,而不是目前的緩存器內容,即使指定的處理器是目前作用中的處理器也一樣。
此外,如果緩存器內容不符合目前的處理器模式設定,這些命令會產生不正確的或毫無意義的輸出。 若要避免輸出錯誤,相依於緩存器狀態的命令會失敗,直到您變更處理器模式以符合緩存器內容為止。 若要變更處理器模式,請使用 .effmach (Effective Machine) 命令,
變更寄存器上下文也可以變更本地上下文。 如此一來,緩存器內容可能會影響局部變數的顯示。
如果發生任何應用程式執行、逐步執行或追蹤,就會立即重設暫存器狀態,使其與程式計數器的位置一致。 在使用者模式中,如果目前的進程或線程已變更,註冊內容也會重設。
暫存器的上下文會影響堆疊追蹤,因為堆疊追蹤從堆疊指標暫存器(在 x86 型處理器上為 esp)所指向的位置開始。 如果暫存器內容設定為無效或無法存取的值,則無法取得堆疊追蹤。
您可以使用 .apply_dbp (將資料斷點套用至暫存器環境) 命令,將處理器斷點(即資料斷點)套用至特定暫存器環境。
區域背景
當程式執行時,局部變數的意義取決於程式計數器的位置,因為這類變數的範圍只會延伸到他們所定義的函式。
當您執行使用者模式或核心模式除錯時,除錯程式會使用目前函式的範圍(堆疊上的目前框架)作為區域上下文。 若要變更此內容,請使用 .frame (設定本機內容) 命令,或在 通話視窗中按兩下所需的視窗。
在使用者模式偵錯中,本地內容一律是目前執行緒堆疊追蹤內的堆疊框架。 在內核模式偵錯中,在地上下文一律是當前暫存器上下文的執行緒堆疊追蹤中的一個框架。
您一次只能針對本地上下文使用一個堆疊框架。 無法存取其他框架中的局部變數。
如果發生下列任何事件,則會重設本機內容:
任何程序執行、逐步執行或追蹤
任何命令中使用線程分隔符 (~)
註冊內容的任何變更
!for_each_frame 延伸模組可讓您針對堆疊中的每個框架重複執行單一命令。 此命令會變更每個框架的本機內容、執行指定的命令,然後將本機內容傳回其原始值。