【发布时间】: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