【发布时间】:2011-09-29 12:19:20
【问题描述】:
我有一大堆 minidump,它们是在应用程序运行时通过 MiniDumpWriteDump 记录的。小型转储是在与我的开发机器不同的操作系统版本的机器上创建的。
现在我正在尝试编写一个程序,使用 dbghelp.dll 从小型转储中提取堆栈跟踪。我正在走 MINIDUMP_MODULE_LIST 并调用 SymLoadModule64,但这无法从公共符号服务器下载 pdb(kernel32 等)。如果我将“C:\Windows\System32”添加到符号路径中,它会找到 dll 并下载符号,但它们当然与 minidump 中的 dll 不匹配,因此结果毫无用处。
那么我如何告诉 dbghelp.dll 下载并使用正确的 pdb?
[编辑]
我忘了说明 SymLoadModule64 只接受一个文件名,没有版本/校验和信息,所以显然单独使用 SymLoadModule64 dbghelp 无法确定要下载哪个 pdb。
信息实际上在 MINIDUMP_MODULE_LIST 中可用,但我不知道如何将其传递回 dbghelp API。
有 SymLoadModuleEx 接受附加参数,但我不知道这是否是我需要的,或者我应该为附加参数传递什么。
[编辑]
到目前为止没有运气,尽管我注意到调试 SDK 中还有 dbgeng.dll 与 dbghelp.dll 一起分发。 MSDN 看起来有据可查,并说它与 windbg 使用的引擎相同。也许我可以用它来提取堆栈跟踪。
如果有人能指出一些关于使用 dbgeng.dll 处理小型转储的介绍,这可能也会有所帮助,因为 MSDN 只记录了各个组件,但没有记录它们如何协同工作。
【问题讨论】:
-
你可能把你的 minidump 弄得太小了。修补 DumpType 参数。确保 Debug + Windows + Modules 列表显示准确的 DLL 路径、版本和时间戳。
-
不,这不是问题,我可以很好地在 WinDbg 中加载 minidump,它可以正确下载 PDB。只是我想自动化堆栈检索,而不是在 WinDbg 中手动检查转储。
-
如果你想走 hack 路线,你可以将命令向下传递给 ntsd 并捕获输出
-
@Paul Betts - 这不是我真正想要的,因为我希望稍后在我让 stackdump 提取工作后扩展自动 minidump 分析。虽然如果没有其他解决方案,我将不得不研究它并采取我能得到的。
标签: windows debugging crash-dumps minidump dbghelp