共用方式為


範圍和符號群組

符號群組包含一組符號,以便作為一個群組進行有效操作。 符號群組可以手動建立和填入,也可以根據詞法範圍中的符號 (例如局部變數和函數引數) 自動產生和更新。 介面 IDebugSymbolGroup 可用來代表符號群組。

有兩種方式可以建立符號群組。 CreateSymbolGroup 會傳回空白的符號群組,而目前字法範圍的符號群組會傳回 GetScopeSymbolGroup

注意 從目前範圍產生的符號集是局部變數的快照。 如果目標中發生任何執行操作,則符號可能會變得不準確。 此外,如果目前的範圍變更,符號群組將不再代表 目前 的範圍 (因為它會繼續代表建立它的作用域) 。

您可以使用 AddSymbol 將符號新增至符號群組,並使用 RemoveSymbolByIndexRemoveSymbolByName 移除符號。 OutputAsType 方法會告知偵錯工具在處理符號的數據時使用不同的符號類型。

注意 具作用域的符號的值可能不準確。 特別是,機器架構和編譯器優化可能會阻止偵錯工具準確判斷符號的值。

符號項目資訊是符號的描述,包括其位置和類型。 若要尋找模組中符號的此資訊,請使用 IDebugSymbols3::GetSymbolEntryInformation。 若要尋找符號群組中符號的這項資訊,請使用 IDebugSymbolGroup2::GetSymbolEntryInformation。 有關符號輸入資訊的詳細資訊,請參閱 DEBUG_SYMBOL_ENTRY

下列方法會傳回符號群組中符號的相關資訊:

如果符號儲存在暫存器或偵錯工具引擎已知的記憶體位置中,則可以使用 WriteSymbol 變更其值。

如果符號包含其他符號,則該符號是 父符號 。 例如,結構包含其成員。 如果符號包含在另一個符號中,則該符號是 子符號 。 符號可以是父符號和子符號。 每個符號群組都有一個平面結構,並包含父符號及其子符號。 每個符號都有一個 深度 -- 符號群組中沒有父項的符號深度為零,而每個子符號的深度都比其父項的深度大一。 父符號的子項可能存在於符號群組中,也可能不存在。 當符號群組中存在子符號時,父符號稱為展開。 若要新增或移除符號群組中符號的子項,請使用 ExpandSymbol

符號群組中的符號數目是由 GetNumberSymbols 傳回。 符號群組中符號的 索引 是識別號碼;索引範圍從零到符號數減一。 每次在符號群組中新增或移除符號時 (例如,透過展開符號),符號群組中所有符號的索引可能會變更。

符號參數,包括父子關聯性的相關資訊,可以使用 GetSymbolParameters 來尋找。 這個方法傳回一個 DEBUG_SYMBOL_PARAMETERS 結構。

符號群組中的符號可以使用 OutputSymbols 方法列印至偵錯工具的輸出流。

範圍

目前的 範圍目前的本地內容決定偵錯引擎公開的本機變數。 範圍有三個元件:

  1. 堆疊框架。

  2. 當前指令。

  3. 寄存器內容。

如果堆疊框架位於呼叫堆疊的頂端,則目前的指令是導致最後一個事件的指令。 否則,目前指令是導致下一個更高堆疊幀的函數呼叫。

GetScopeSetScope 方法可用來取得和設定目前的範圍。 發生事件時,目前的範圍會設定為事件的範圍。 您可以使用 ResetScope 將目前的範圍重設為最後一個事件的範圍。

執行緒上下文

執行緒內容是 Windows 在切換執行緒時保留的狀態。 這類似於暫存器內容,不同之處在於有一些僅限核心的處理器狀態是暫存器內容的一部分,但不是執行緒內容的一部分。 這個額外的狀態可在內核模式偵錯期間作為緩存器使用。

執行程內容是由 ntddk.h 中定義的 CONTEXT 結構所代表。 此結構取決於平台,其解譯取決於有效的處理器類型。 GetThreadContextSetThreadContext 方法可用來取得和設定執行緒內容。