【问题标题】:SymGetModuleInfo64 returns empty GUIDSymGetModuleInfo64 返回空 GUID
【发布时间】:2012-08-22 09:48:27
【问题描述】:

我正在尝试通过使用 EnumerateLoadedModules64 枚举加载的模块并在使用 SymLoadModuleEx 的枚举回调加载模块中获取模块 GUID,然后获取模块使用 SymGetModuleInfoW64 获取信息。

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

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

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

【问题讨论】:

    标签: c++ windows guid symbols callstack


    【解决方案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

    【讨论】:

    • 哦,闪亮!我会看看这个,看看它是否能解决我的问题!提前致谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多