-2

我想知道是否有任何可用的 API 可以创建完整的故障转储。

目前,我正在使用MiniDumpWriteDump() API 和MiniDumpWithFullMemory。但是,我没有从创建的转储中获得太多信息来分析。

4

1 回答 1

-1

你说你需要一个调用堆栈和内存信息——这对调试都很有用=)!

调用堆栈

了解如何从故障转储文件创建调用堆栈会很有帮助。这是来自 MSDN 关于如何生成调用堆栈的引述,我在这里删除了我发现最相关的要点,但值得完整阅读链接

  • 当您调试已崩溃的应用程序时,调试器会尝试向您显示堆栈中导致崩溃的函数。如果没有 PDB 文件,调试器将无法解析函数名称、它们的参数或存储在堆栈上的任何局部变量。
  • 如果当前堆栈上的函数是使用省略帧指针 (/Oy) 优化编译的,并且如果符号不存在,则调试器无法可靠地确定哪个函数调用了当前函数。
  • 如果您看到有关缺少符号或未加载符号的警告,...请不要相信从那时起的堆栈。
  • 即使调用堆栈中的库没有可用的 PDB,只要它们是使用帧指针编译的,调试器就应该能够正确猜测父函数。从 Windows XP Service Pack 2 开始,所有 Windows DLL 和可执行文件都在禁用 FPO 的情况下编译...在 Windows XP SP2 之前的 Windows 版本上,所有操作系统二进制文件都需要包含 FPO 信息的匹配符号文件,以允许准确的调试和分析.
  • 如果您调试 64 位本机可执行文件,则不需要符号文件来生成有效的堆栈跟踪,因为 x64 操作系统和编译器被设计为不需要它们。但是,您仍然需要符号文件来检索函数名称、调用参数和局部变量。

我仍然会研究您实际上已经在使用的 Windows 错误报告(API)——特别是设置本地故障转储。您可以使用注册表项打开它们,然后通过设置 DumpType=2 启用“完全转储”。如果您需要从代码生成故障转储文件,我会尝试在这篇 MSDN 文章中关于故障转储分析的优化。

有关使用注册表设置设置本地故障转储的更多信息,请参阅收集用户模式转储- 或尝试故障转储分析文件中的优化 - 并确保您拥有 PDB =)。

调试愉快。

于 2016-02-26T21:30:41.253 回答