1

EnumerateLoadedModules64 を使用してロードされたモジュールを列挙し、 SymLoadModuleEx を使用して列挙コールバックロードモジュールで、その後SymGetModuleInfoW64を使用してモジュール情報を取得することにより、現在のプロセスからモジュール GUID を取得しようとしています。

既存の PDB を持つすべてのモジュールに対して、この呼び出しは成功し、PdbSig70にはモジュールの GUID が含まれます。ただし、PDB ファイルを削除すると、呼び出しは成功しますが、GUID は空です。

dumpbin.exe /headers [exefile]は PDB ファイルなしで GUID 情報を表示できるため、情報が exe ファイルにあることはわかっています。

問題は、実行中のプロセスからこの情報を取得する方法です。後でシンボル サーバーを使用してシンボルを検索できるように、コールスタック アドレスとモジュール情報を含む PDB なしでユーザーがクラッシュ レポートを生成できるようにするには、この情報が必要です。

4

1 に答える 1

1

同じことをしようとしていて、これを見つけました:

struct CV_INFO_PDB70
{
    DWORD  CvSignature;
    GUID Signature;
    DWORD Age;
    BYTE PdbFileName[];
};

ULONG dirEntrySize;
BOOLEAN mappedAsImage = TRUE;
size_t imageAddress = static_cast<size_t>(IMAGEHLP_MODULEW64_VAR.BaseOfImage);
IMAGE_DEBUG_DIRECTORY* debugDirectory = reinterpret_cast<IMAGE_DEBUG_DIRECTORY*>(sImageDirectoryEntryToDataEx(reinterpret_cast<PVOID>(imageAddress), mappedAsImage, IMAGE_DIRECTORY_ENTRY_DEBUG, &dirEntrySize, NULL));    size_t debugEnd = reinterpret_cast<size_t>(debugDirectory) + dirEntrySize;
while(reinterpret_cast<size_t>(debugDirectory) < debugEnd)
{
    if(debugDirectory->Type == IMAGE_DEBUG_TYPE_CODEVIEW)
    {
        break;
    }
    ++debugDirectory;
}
CV_INFO_PDB70* information = reinterpret_cast<CV_INFO_PDB70*>(static_cast<DWORD>(imageAddress) + debugDirectory->AddressOfRawData);

詳細はこちら: http://www.debuginfo.com/articles/debuginfomatch.html

于 2012-08-29T15:53:29.710 に答える