1

我试图通过使用EnumerateLoadedModules64枚举加载的模块并在使用SymLoadModuleEx的枚举回调加载模块中获取模块 GUID,然后使用SymGetModuleInfoW64获取模块信息,从而从当前进程中获取模块 GUID 。

对于具有现有 PDB 的所有模块,此调用成功,并且PdbSig70包含模块的 GUID。但是,如果我删除 PDB 文件,则调用成功但GUID 为空

我知道该信息在 exe 文件中,因为dumpbin.exe /headers [exefile]可以在没有 PDB 文件的情况下显示 GUID 信息。

问题是如何从正在运行的进程中获取这些信息。我希望这些信息能够让用户在没有带有调用堆栈地址和模块信息的 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 回答