我试图通过使用 EnumerateLoadedModules64 枚举已加载的模块并使用 SymLoadModuleEx 在枚举回调加载模块中获取当前进程中的模块GUID,然后获取模块使用 SymGetModuleInfoW64 。
的信息对于具有现有PDB的所有模块,此调用成功, PdbSig70 包含模块的GUID。但是,如果我删除了PDB文件,则调用成功,但 GUID为空。
我知道该信息在exe文件中,因为 dumpbin.exe / headers [exefile] 可以显示没有PDB文件的GUID信息。
问题是如何从正在运行的进程中获取此信息。我希望这些信息能够让用户在没有带有callstack地址和模块信息的PDB的情况下生成崩溃报告,以便我可以在以后使用符号服务器查找符号。
答案 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