10

SymLoadModuleExPDBファイルからシンボルをロードするために呼び出してSymFromAddrから、そのPDBからシンボルを検索するために使用しようとしています。BaseOfDllただし、パラメータに何を渡すかがわかりませんDllSize。ドキュメントには、PDBファイルをロードするときに、これらのパラメータを0にすることはできないと明示的に記載されており、実際に0を渡そうとすると失敗しERROR_INVALID_PARAMETERます。

私のコードは次のようになります。

SymSetOptions(SYMOPT_LOAD_LINES);
HANDLE hprocess = GetCurrentProcess();
if (!SymInitialize(hprocess, NULL, FALSE))
    die("SymInitialize");

if(SymLoadModuleEx(hprocess, NULL, "full path to some PDB file.pdb", NULL,
                   0,  // What to pass here?
                   0,  // What to pass here?
                   NULL, 0) == 0)
{
    die("SymLoadModuleEx");
}

PDBファイルをロードするときに何を渡して何を渡すBaseOfDllかをどのように理解しますか?DllSize問題のPDBファイルは別のプログラム実行可能ファイル(DLLではない)のシンボルファイルであり、議論のために、PDBが生成された元のEXEにアクセスできないと仮定します。

または、PDBファイルから特定のアドレスに対応するシンボルを検索するためのより良い方法はありますか?

4

3 に答える 3

10

dbghelp.dllとSym*ここでのメソッドは、Debug Interface Access(DIA)SDKを利用します。1
DIA自体はCOMベースであり、DbgHelpが提供するものよりもはるかに柔軟性があります。

具体的には、既知のPDBをロードし、アドレスに基づいてシンボルを検索するには、次のようにします。

  1. DIAデータソースをCoCreateします(ここの「例」セクションを参照)。
  2. 特定のPDBをロードするために使用IDiaDataSource::loadDataFromPdbします(DLLサイズとベースア​​ドレスは必要ありません)。
  3. データソースIDiaDataSource::openSessionのを取得するために使用します。IDiaSession
  4. 絶対仮想アドレス(VA)または相対仮想アドレス(RVA)のどちらを使用しているかに応じて、findSymbolByVAまたはfindSymbolByRVAをそれぞれ使用して、そのアドレスにIDiaSymbol関連付けられたアドレスを取得できます。
  5. 最後に、を使用IDiaSymbol::get_nameして、指定したアドレスを含む関数名を取得できます。

これには元の画像は必要ありません。PDBのみが必要です。Visual Studioを使用しているとすると、DIAのヘッダーとライブラリは(たとえば)で利用できます
C:\Program Files (x86)\Microsoft Visual Studio 10.0\DIA SDK

于 2011-02-01T21:05:39.263 に答える
0

コメントする権限がないので、別の回答でこれを行います。

  1. はい、DbgHelp は DIA のラッパーですが、静的ライブラリに関してのみです。DIA は、DbgHelp.dll に静的にリンクされています。DbgHelp は、COM をバイパスして Dia の COM クラス ファクトリ (IClassFactory) 実装を直接呼び出します。私は 6.1.7601.17514 バージョンについて話しています。したがって、DbgHelp.dll は自己完結型です (symcrv.dll および srcsrv.dll と組み合わせて)。
  2. Dia COM オブジェクトは Visual Studio (dbgeng.dll と同じ場所) に同梱されているため、VS がインストールされていない環境では解決できません (ただし、ActivateActCtxを介してそれを指すプライベート アセンブリとして msdia120.dll を使用することはできますが、依存関係がある場合は、依存関係もデプロイする必要があります)
  3. DbgHelp はコンパクトであり、Microsoft によってアプリケーションと共にプライベート コピーを配布することをお勧めします。 「これらの含まれる DLL の再配布ポリシーは、人々がこれらのファイルを独自のパッケージに含めてリリースすることをできるだけ簡単にするために特別に設計されました」を参照してください。

  4. DIA インターフェイスを使用して PDB ファイルをダウンロードする方法が見つかりませんでした。Sym API はこれを可能にします。SymSrv.dll への呼び出しを委任します。

したがって、元の質問はまだ実際です。

于 2015-12-15T18:59:50.343 に答える