SymGetModuleInfo64返回空GUID

时间:2012-08-22 09:48:28

标签: c++ windows guid symbols callstack

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

的信息

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

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

问题是如何从正在运行的进程中获取此信息。我希望这些信息能够让用户在没有带有callstack地址和模块信息的PDB的情况下生成崩溃报告,以便我可以在以后使用符号服务器查找符号。

1 个答案:

答案 0 :(得分: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