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