範圍和符號群組
符號群組包含一組符號,以有效率地以群組方式操作。 您可以手動建立和填入符號群組,也可以根據語彙範圍中的符號自動產生和更新,例如區域變數和函式引數。 介面 IDebugSymbolGroup 用來代表符號群組。
有兩種方式可以建立符號群組。 CreateSymbolGroup會傳回空的符號群組,而且GetScopeSymbolGroup會傳回目前語彙範圍的符號群組。
注意 從目前範圍產生的符號群組是區域變數的快照集。 如果目標中發生任何執行,符號可能不再正確。 此外,如果目前的範圍變更,符號群組將不再代表 目前 的範圍 (,因為它會繼續代表建立) 的範圍。
符號可以使用 AddSymbol新增至符號群組,並使用 RemoveSymbolByIndex 或 RemoveSymbolByName移除。 OutputAsType方法會告知偵錯工具在處理符號的資料時使用不同的符號類型。
注意 範圍符號的值可能不正確。 特別是,機器架構和編譯器優化可能會防止偵錯工具正確判斷符號的值。
符號專案資訊是符號的描述,包括其位置和類型。 若要尋找模組中符號的這項資訊,請使用 IDebugSymbols3::GetSymbolEntryInformation。 若要尋找符號群組中符號的這項資訊,請使用 IDebugSymbolGroup2::GetSymbolEntryInformation。 如需符號專案資訊的詳細資訊 ,請參閱DEBUG_SYMBOL_ENTRY 。
下列方法會傳回符號群組中符號的相關資訊:
GetSymbolName 會傳回符號的名稱。
如果符號具有絕對位址,GetSymbolOffset會傳回符號之目標虛擬位址空間中的絕對位址。
如果符號包含在暫存器中,GetSymbolRegister會傳回包含符號的暫存器。
GetSymbolSize 會傳回符號的資料大小。
GetSymbolTypeName 會傳回符號類型的名稱。
GetSymbolValueText 會以字串的形式傳回符號的值。
如果符號儲存在偵錯工具引擎已知的暫存器或記憶體位置中,可以使用 WriteSymbol變更其值。
如果符號包含其他符號,則符號是 父符號 。 例如,結構包含其成員。 如果符號包含在另一個符號中,符號就是 子符號 。 符號可以是父代和子符號。 每個符號群組都有一個平面結構,並包含父符號及其子系。 每個符號都有 深度 -- 符號群組中沒有父代的符號深度為零,而且每個子符號的深度都大於其父代的深度。 父代符號的子系可能不存在於符號群組中。 當子系出現在符號群組中時,父符號稱為 展開。 若要在符號群組中新增或移除符號的子系,請使用 ExpandSymbol。
GetNumberSymbols會傳回符號群組中的符號數目。 符號群組中的符號 索引 是識別碼;索引的範圍從零到符號數目減一。 每次將符號新增至符號群組或從符號群組中移除時 ,例如展開符號 -- 符號群組中所有符號的索引可能會變更。
您可以使用 GetSymbolParameters找到符號參數,包括父子式關聯性的相關資訊。 這個方法會傳回 DEBUG_SYMBOL_PARAMETERS 結構。
符號群組中的符號可以使用 OutputSymbols方法列印到偵錯工具的輸出資料流程。
範圍
目前的範圍或目前的本機內容會決定偵錯工具引擎所公開的區域變數。 範圍有三個元件:
堆疊框架。
目前的指示。
暫存器內容。
如果堆疊框架位於呼叫堆疊頂端,則目前的指令是導致最後一個事件的指令。 否則,目前的指令是導致下一個較高堆疊框架的函式呼叫。
GetScope和SetScope方法可用來取得和設定目前的範圍。 事件發生時,目前的範圍會設定為事件的範圍。 目前的範圍可以使用 ResetScope重設為最後一個事件的範圍。
執行緒內容
執行緒內容是切換執行緒時 Windows 所保留的狀態。 這類似于暫存器內容,不同之處在于有一些僅限核心的處理器狀態是暫存器內容的一部分,但不是執行緒內容。 這個額外的狀態可在核心模式偵錯期間當做暫存器使用。
執行緒內容是由 ntddk.h 中定義的 CONTEXT 結構來表示。 此結構與平臺相關,而且其解譯取決於有效的處理器類型。 GetThreadCoNtext和SetThreadCoNtext的方法可用來取得和設定執行緒內容。