次の方法で共有


パブリック シンボル、グローバル シンボル、ローカル シンボル

DbgHelp API のシンボル処理機能は、長年にわたって進化してきました。 コードがさまざまなシナリオで動作し、シンボルの完全な詳細が提供されるようにするには、可能な限り最新の関数を使用してください。 たとえば、SymEnumSymbolsSymEnumerateSymbols64SymFromNameSymGetSymFromName64SymFromAddrSymGetSymFromAddr64 に置き換えられます。

パブリック シンボル

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 関数を呼び出します。 SymFromNameSymEnumSymbols への後続の呼び出しは、このアドレスのコンテキスト内で動作できます。 これを行うには、BaseOfDll パラメーターを NULL に設定し、Name パラメーターまたは Mask パラメーターからモジュール指定子を省略します。 これにより、DbgHelp は SymSetContext によって示されるスコープ内の一致するシンボルを検索します。

シンボルがパラメーターであるかどうかを判断するには、SYMBOL_INFO 構造体の Flags メンバーをチェックします。 シンボルがパラメーターの場合、メンバーには SYMFLAG_PARAMETER が含まれます。 ローカル シンボルの場合、メンバーには SYMFLAG_LOCAL が含まれます。