【问题标题】:Dump call stack on error?错误时转储调用堆栈?
【发布时间】:2013-03-19 13:04:52
【问题描述】:

我正在将一个用纯 C(没有 C++、MFC、.NET 等)编写的程序调试到 WIN32API。它必须在 VS2005(在 Win 2K/XP 下运行)和 VS2010(在 Win7 下运行)都编译。我无法复制我的客户似乎能够相当可靠地复制的错误,所以我正在寻找方法让我的程序按原样“调试自身”。它正在监视所有正在更改的键值,但我真正希望看到的是值更改时的堆栈转储。哦,如果不在客户的机器上安装编译器,我就无法运行“真正的”调试版本(使用调试库),这不是一个选项,因此必须将它内置到我的发布版本中。

除了将我自己的函数进入/退出调用添加到我自己的堆栈监视器之外,还有其他方法吗?我特别希望能够在特定内存地址意外更改时设置硬件断点(因此我需要能够在少数预期更改位置周围禁用/启用它。)这可能吗?在 Windows 程序中?

如果可能的话,我更喜欢不需要更改数千行代码的东西。是的,在开发工具方面我处于弱势地位——我认为自己很幸运拥有 Visual Studio IDE 的专业版。

--编辑-- 除了下面提供的优秀答案之外,我还在http://www.codereversing.com/blog/?p=76 找到了一些关于在您自己的代码中使用硬件断点的信息。我认为它是为了破解其他程序的想法而编写的,但它看起来可能会满足我的需要,允许我在意外位置写入变量时创建一个小型转储。那会很酷而且非常有用,尤其是如果我可以概括它的话。感谢您的回答,现在我要去看看我可以使用所有这些新信息创建什么!

【问题讨论】:

  • 离题:如果你不能复制它而客户可以,那么很可能是他们这边的一些配置。
  • @m0skit0 这是毫无根据的假设
  • @m0skit0 客户的机器有我无法使用的硬件,因为它是监控铀预处理为发电厂燃料的系统的一部分。他们不让我在办公室里放那些东西,而且我发现自己无法很好地模拟它来复制错误。
  • 在访问冲突时创建转储文件stackoverflow.com/q/13876222/1888362

标签: c windows winapi


【解决方案1】:

您可以使用MiniDumpWriteDump 函数创建一个转储,该转储可用于事后调试。在应用程序崩溃的情况下,您可以从SetUnhandledExceptionFilter 设置的未处理异常处理程序中调用MiniDumpWriteDump。如果你说的bug不是crash,当检测到一些意外情况时,你可以从程序的任何地方调用MiniDumpWriteDump。更多关于故障转储和事后调试的信息:http://www.codeproject.com/Articles/1934/Post-Mortem-Debugging-Your-Application-with-Minidu

该技术的主要思想是将在客户端站点上生成的小型转储文件发送给开发人员,它们可以进行调试 - 线程、堆栈和变量信息可用(代码优化导致的明显限制)。

【讨论】:

  • 谢谢!我认为这几乎正是我想要的。
【解决方案2】:

dbghelp32.dll 中有许多 Win32 函数可用于为给定线程生成堆栈跟踪:有关此示例,请参阅 this code

您也可以在 MSDN 上查找 StackWalk64() 和相关函数。

要获得有用的信息,您应该在编译器中为您的发布版本打开 PDB 文件生成:如果您设置安装程序,以便在客户的计算机上 PDB 文件与 DLL 位于同一位置,那么您可以通过函数名称等获得可理解的堆栈跟踪。没有这些,您将只获得函数的 DLL 名称和十六进制地址。

我不确定设置硬件断点有多实用:您可以编写某种使用 Win32 调试 API 的调试器,但这可能比它的价值更麻烦。

【讨论】:

  • 我希望我能接受这个答案以及 MiniDump 的建议。因为我认为 MiniDump 会更容易使用(不需要在客户机器上安装额外的文件),所以我会使用它,但我会记住 StackWalker64,因为它看起来也很有用。谢谢!
【解决方案3】:

如果您可以添加 limited 工具以在症状再次出现时引发可识别的异常,则可以使用 Process Dumper 在该异常的任何实例上生成完整的进程转储。

我发现我经常引用这个工具,它对于难以调试的生产问题来说是天赐之物,但似乎鲜为人知。

【讨论】:

  • 哇,三个有效且有用的答案!如果 MiniDump 没有提供足够的信息,我认为 ProcessDumper 将是我尝试的下一件事。谢谢!
猜你喜欢
  • 1970-01-01
  • 2012-01-03
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
相关资源
最近更新 更多