gpt4 book ai didi

windows - 如何从小型转储中提取堆栈跟踪?

转载 作者:可可西里 更新时间:2023-11-01 12:48:14 29 4
gpt4 key购买 nike

我有一大堆小型转储,这些小型转储是在应用程序运行期间通过 MiniDumpWriteDump 记录的。小型转储是在操作系统版本与我的开发机器不同的机器上创建的。

现在我正在尝试编写一个程序,使用 dbghelp.dll 从小型转储中提取堆栈跟踪。我正在遍历 MINIDUMP_MODULE_LIST 并调用 SymLoadModule64,但这无法从公共(public)符号服务器下载 pdb(kernel32 等)。如果我将“C:\Windows\System32”添加到符号路径,它会找到 dll 并下载符号,但当然它们与小型转储中的 dll 不匹配,因此结果无用。

那么我该如何告诉 dbghelp.dll 下载并使用正确的 pdb?

[编辑]

我忘了声明 SymLoadModule64 只需要一个文件名,没有版本/校验和信息,所以显然单独使用 SymLoadModule64 dbghelp 无法确定要下载哪个 pdb。

信息实际上在 MINIDUMP_MODULE_LIST 中可用,但我不知道如何将它传回 dbghelp API。

有一个 SymLoadModuleEx 需要额外的参数,但我不知道这是否是我需要的,或者我应该为额外的参数传递什么。

[编辑]

虽然我注意到在调试 SDK 中还有 dbgeng.dll 和 dbghelp.dll 一起分发,但到目前为止运气不好。 MSDN 看起来有很好的文档,并说它与 windbg 使用的引擎相同。也许我可以用它来提取堆栈跟踪。

如果有人可以向我介绍一些使用 dbgeng.dll 处理小型转储的介绍,这可能也会有所帮助,因为 MSDN 仅记录了各个组件,但没有记录它们如何协同工作。

最佳答案

以防万一其他人想要从转储中自动提取堆栈跟踪,这就是我最终做的事情:

就像我在更新中提到的那样,可以使用 dbgeng.dll 而不是 dbghelp.dll,这似乎与 WinDbg 使用的引擎相同。经过一些试验和错误后,这里介绍了如何使用与 WinDbg 相同的符号加载机制来获得良好的堆栈跟踪。

  • 调用 DebugCreate 获取调试引擎实例
  • 查询 IDebugClient4、IDebugControl4、IDebugSymbols3
  • 使用 IDebugSymbols3.SetSymbolOptions 配置符号的加载方式(有关 WinDbg 使用的选项,请参阅 MSDN)
  • 像在 WinDbg 中一样使用 IDebugSymbols3.SetSymbolPath 设置符号路径
  • 使用 IDebugClient4.OpenDumpFileWide 打开转储
  • 使用 IDebugControl4.WaitForEvent 等待转储加载完毕
  • 使用 IDebugSymbols3.SetScopeFromStoredEvent 选择存储在转储中的异常
  • 使用 IDebugControl4.GetStackTrace 获取最后几个堆栈帧
  • 使用 IDebugClient4.SetOutputCallbacks 注册接收解码堆栈跟踪的监听器
  • 使用 IDebugControl4.OutputStackTrace 处理栈帧
  • 使用 IDebugClient4.SetOutputCallbacks 取消注册回调
  • 发布接口(interface)

对 WaitForEvent 的调用似乎很重要,因为如果没有它,以下调用将无法提取堆栈跟踪。

那里似乎仍然存在一些内存泄漏,无法判断是我没有正确清理还是 dbgeng.dll 内部的东西,但我可以每 20 个转储左右重新启动进程,所以我没有'调查更多。

关于windows - 如何从小型转储中提取堆栈跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594971/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com