變更內容

在核心模式偵錯中,有許多進程、執行緒,有時有使用者會話同時執行。 Therfore,例如「虛擬位址0x80002000」或「 eax register」等片語模棱兩可。 您必須指定可以理解這類片語 的內容

偵錯工具有五個不同的內容,您可以在偵錯時設定:

  1. 會話內容會指出預設的使用者會話。

  2. 進程內容會決定偵錯工具如何解譯虛擬位址。

  3. 使用者模式位址內容幾乎永遠不會直接設定。 當您變更進程內容時,會自動設定此內容。

  4. 暫存器內容會決定偵錯工具如何解譯暫存器,以及控制堆疊追蹤的結果。 此內容也稱為 執行緒內容,但該字詞不完全精確。 明確內容也是暫存器內容的類型。 如果您指定明確的內容,則會使用該內容,而不是目前的暫存器內容。

  5. 本機內容會決定偵錯工具如何解譯區域變數。 此內容也稱為 範圍

會話內容

多個登入會話可以同時執行。 每個登入會話都有自己的進程。

!session延伸模組會顯示所有登入會話,或變更目前的會話內容。

當會話編號輸入為 「-2」 時, !sprocess!spoolused 擴充 功能會使用會話內容。

當會話內容變更時,進程內容會自動變更為該會話的作用中進程。

進程內容

每個進程都有自己的頁面目錄,可記錄虛擬位址對應至實體位址的方式。 當進程內的任何執行緒正在執行時,Windows 作業系統會使用此頁面目錄來解譯虛擬位址。

在使用者模式偵錯期間,目前的進程會決定進程內容。 偵錯工具命令、延伸模組和偵錯資訊視窗中使用的虛擬位址會使用目前進程的頁面目錄來解譯。

在核心模式偵錯期間,您可以使用 .process (設定進程內容) 命令來設定進程內容。 使用此命令來選取用來解譯虛擬位址的進程頁面目錄。 設定進程內容之後,您可以在任何接受位址的命令中使用此內容。 您甚至可以在此位址設定中斷點。 藉由在.process命令中包含/i選項來指定入侵偵錯,您也可以使用核心偵錯工具在使用者空間中設定中斷點。

您也可以在核心空間函式上使用進程特定的中斷點,從核心偵錯工具設定使用者模式中斷點。 設定策略中斷點,並等候適當的內容出現。

使用者模式位址內容是進程內容的一部分。 一般而言,您不需要直接設定使用者模式位址內容。 如果您設定進程內容,則使用者模式位址內容會自動變更為進程相關頁面表的目錄基底。

當您在核心模式偵錯期間設定進程內容時,該進程內容會保留,直到另一個 .process 命令變更內容為止。 使用者模式位址內容也會保留,直到 .process.coNtext 命令變更為止。 當目的電腦執行時,這些內容不會變更,而且不會受到登錄內容或本機內容的變更影響。

註冊內容

每個執行緒都有自己的暫存器值。 當執行緒執行時,這些值會儲存在 CPU 暫存器中,並在另一個執行緒執行時儲存在記憶體中。

在使用者模式偵錯期間,目前的執行緒通常會判斷暫存器內容。 在偵錯工具命令、延伸模組和偵錯資訊視窗中註冊的任何參考,會根據目前線程的暫存器來解譯。

當您使用下列其中一個命令執行使用者模式偵錯時,可以將暫存器內容變更為目前線程以外的值:

.cxr (顯示內容記錄)

.ecxr (顯示例外狀況內容記錄)

在核心模式偵錯期間,您可以使用各種偵錯工具命令來控制註冊內容,包括下列命令:

.thread (設定暫存器內容)

.cxr (顯示內容記錄)

.trap (顯示陷阱框架)

這些命令不會變更 CPU 暫存器的值。 相反地,偵錯工具會從記憶體中的位置擷取指定的暫存器內容。 實際上,偵錯工具只能擷取 已儲存 的暫存器值。 (其他值會動態設定,而且不會儲存。 儲存的值足以重新建立堆疊追蹤。

設定暫存器內容之後,新的暫存器內容會用於任何使用暫存器值的命令,例如 k (Display Stack Backtrace) r (Registers)

不過,當您偵錯多處理器電腦時,某些命令可讓您指定處理器。 (如需這類命令的詳細資訊,請參閱 Multiprocessor Syntax.) 如果您為命令指定處理器,此命令會使用指定處理器上的使用中線程暫存器內容,而不是目前的暫存器內容,即使指定的處理器是目前作用中的處理器也一樣。

此外,如果暫存器內容不符合目前的處理器模式設定,這些命令會產生不正確的或無意義的輸出。 為了避免輸出錯誤,相依于暫存器狀態的命令會失敗,直到您變更處理器模式以符合暫存器內容為止。 若要變更處理器模式,請使用 .effmach (Effective Machine) 命令,

變更暫存器內容也可以變更本機內容。 如此一來,暫存器內容可能會影響區域變數的顯示。

如果發生任何應用程式執行、逐步執行或追蹤,暫存器內容就會立即重設,以符合程式計數器的位置。 在使用者模式中,如果目前的進程或執行緒已變更,暫存器內容也會重設。

暫存器內容會影響堆疊追蹤,因為堆疊追蹤會從堆疊指標在 x86 處理器上註冊 (esp 的位置開始) 指向。 如果暫存器內容設定為無效或無法存取的值,則無法取得堆疊追蹤。

您可以使用 .apply_dbp (將資料中斷點套用至特定暫存器內容, (資料中斷點 ) 套用處理器中斷點至內容) 命令。

本機內容

當程式執行時,區域變數的意義取決於程式計數器的位置,因為這類變數的範圍只會延伸到它們所定義的函式。

當您執行使用者模式或核心模式偵錯時,偵錯工具會使用目前函式的範圍, (堆疊上目前框架) 做為本機內容。 若要變更此內容,請使用 .frame (設定本機內容) 命令,或按兩下 [ 呼叫] 視窗中所需的框架。

在使用者模式偵錯中,本機內容一律是目前線程堆疊追蹤內的框架。 在核心模式偵錯中,本機內容一律是目前暫存器內容執行緒堆疊追蹤內的框架。

您一次只能針對本機內容使用一個堆疊框架。 無法存取其他畫面格中的區域變數。

如果發生下列任何事件,就會重設本機內容:

  • 任何程式執行、逐步執行或追蹤

  • 在任何命令中使用執行緒分隔符號 (~)

  • 註冊內容的任何變更

!for_each_frame延伸模組可讓您針對堆疊中的每個畫面重複執行單一命令。 此命令會變更每個畫面的本機內容、執行指定的命令,然後將本機內容傳回其原始值。