パブリック シンボル、グローバル シンボル、ローカル シンボル
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 はパブリック シンボルのみを検索します。
ローカル シンボルまたは関数パラメーターを表示するには、任意の関数シンボルのアドレスに設定された IMAGEHLP_STACK_FRAME 構造体の InstructionOffset メンバーを使用して、SymSetContext 関数を呼び出します。 SymFromName と SymEnumSymbols への後続の呼び出しは、このアドレスのコンテキスト内で動作できます。 これを行うには、BaseOfDll パラメーターを NULL に設定し、Name パラメーターまたは Mask パラメーターからモジュール指定子を省略します。 これにより、DbgHelp は SymSetContext によって示されるスコープ内の一致するシンボルを検索します。
シンボルがパラメーターであるかどうかを判断するには、SYMBOL_INFO 構造体の Flags メンバーをチェックします。 シンボルがパラメーターの場合、メンバーには SYMFLAG_PARAMETER が含まれます。 ローカル シンボルの場合、メンバーには SYMFLAG_LOCAL が含まれます。