我正在调试一个用纯 C(没有 C++、MFC、.NET 等)编写的程序到 WIN32API。它必须在 VS2005(在 Win 2K/XP 下运行)和 VS2010(在 Win7 下运行)都编译。我无法复制我的客户似乎能够相当可靠地复制的错误,所以我正在寻找方法让我的程序按原样“调试自身”。它正在监视所有正在更改的键值,但我真正想看到的是值更改时的堆栈转储。哦,如果不在客户的机器上安装编译器,我就无法运行“真正的”调试版本(使用调试库),这不是一个选项,所以这必须内置到我的发布版本中。
除了将我自己的函数进入/退出调用添加到我自己的堆栈监视器之外,还有什么方法可以做到这一点?我特别希望能够在特定内存地址意外更改时设置硬件断点(因此我需要能够在少数预期更改位置周围禁用/启用它。)这可能吗?在 Windows 程序中?
如果可能的话,我更喜欢不需要更改几千行代码的东西。是的,在开发工具方面,我的地位非常低下——我认为自己很幸运拥有 Visual Studio IDE 的专业版。
--edit-- 除了下面提供的出色答案之外,我还在http://www.codereversing.com/blog/?p=76找到了一些关于在您自己的代码中使用硬件断点的信息。我认为它是为了破解其他程序的想法而编写的,但它看起来可能会满足我的需要,允许我在意外位置写入变量时创建一个小型转储。那会很酷而且非常有用,尤其是如果我可以概括它的话。感谢您的回答,现在我要去看看我可以使用所有这些新信息创建什么!