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