共用方式為


公用、全域和本機符號

DbgHelp API 的符號處理功能多年來已演進。 若要確保您的程式代碼可在各種案例中運作,並提供符號的完整詳細數據,請盡可能使用最新的函式。 例如,SymEnumSymbols 會取代 SymEnumerateSymbols64、SymFromName 取代 SymGetSymFromName64,而 SymFromAddr 取代 SymGetSymFromAddr64。

公用符號

DbgHelp.dll初始版本僅支援檢查公用符號。 這些符號會針對程序代碼中的任何專案產生,這些項目必須在不同的原始程式檔之間公開。 它們也包含從模組匯出的所有專案。

符號會內嵌在映射中,或分別儲存在 .dbg 或 .pdb 檔案中。 唯一儲存的資訊是符號名稱和位址。 這些名稱可做為裝飾名稱。 若要檢視未編碼的名稱,請使用 SYMOPT_UNDNAME 呼叫 SymSetOptions 函式,或使用 UnDecorateSymbolName 函式。

請注意,DbgHelp API 最初不是為了支援模組內相同符號的多個實例所設計。 這是因為公用符號僅限於模組內的唯一名稱。 因此, SymGetSymFromName64 只會傳回符合的第一個符號。 若要擷取符合的所有符號,請呼叫 SymEnumSymbols

全域和本機符號

較新版本的 DbgHelp.dll在使用 .pdb 檔案時支援全域和本機符號。 這些新版本包括靜態函式、來源檔案範圍內的函式、函式參數和局部變數。 當 DbgHelp 搜尋符號時,它會先檢查全域和本機符號數據表,再檢查公用符號數據表。 這是因為這些類型的符號有比公用符號可用的更多資訊。

全域和本機符號會以未編碼的名稱儲存。 因此,SYMOPT_UNDNAME旗標沒有任何作用。 若要取得裝飾符號名稱,您必須使用 SYMOPT_PUBLICS_ONLY 旗標。 這會導致 DbgHelp 只搜尋公用符號。

若要檢視本機符號或函式參數,請呼叫 SymSetContext 函式,並將 IMAGEHLP_STACK_FRAME 結構中的 InstructionOffset 成員設定為任何函式符號的位址。 後續對 SymFromNameSymEnumSymbols 的呼叫可以在此位址的內容中運作。 若要這樣做,請將BaseOfDll參數設定為NULL,並從 NameMask 參數省略模組規範 這會強制 DbgHelp 在 SymSetContext指示的範圍內搜尋相符的符號。

若要判斷符號是否為參數,請檢查 SYMBOL_INFO 結構的 Flags 成員。 如果符號是參數,則成員會包含SYMFLAG_PARAMETER。 如果它是本機符號,則成員會包含SYMFLAG_LOCAL。