3

经过长时间的调试,我发现我的应用程序可能将错误的值写入地址 0x5b81730。我想知道我的代码的哪一部分是这样做的。

前段时间,当我使用 Windows XP 时,这将非常容易。我会在调试器(MS Visual Studio 2005)中重新启动我的应用程序,在该地址设置一个数据断点,然后调试器会指向我有问题的代码。

现在,在我切换到 Windows 7 之后,这似乎是不可能的(或者至少非常困难)。当我运行我的应用程序时,我发现每次堆中同一对象的地址都略有不同(例如,一次运行为 0x53b71b4,而另一次运行为 0x55471b4)。

我听说 Windows 7 有ASLR,这可能是我看到这些地址变化的原因。

那么我该怎么做才能继续使用我的调试技术呢?

我应该关闭 ASLR 吗?(我相信这是可能的,但不知道怎么做)

还是我的问题是由其他原因而不是 ASLR 引起的?

还是我应该忘记使用数据断点的便利,而使用其他一些技术?

4

2 回答 2

3

如果您使用的是 UB 之类的东西,则绝对不能保证地址是什么。你不能指望它每次都一样。

但是,您可以尝试在链接器设置中禁用 ASLR - 其中一个属性是“随机基地址”。

命令行语法是/DYNAMICBASE:NO. 它在 Visual Studio 2005 中不存在,但在 VS 2012 及更高版本中确实存在。

于 2013-02-28T14:01:45.380 回答
1

我会尝试使用Application Verifier。这是调试内存泄漏问题的好方法。当存在内存损坏问题时,它将中断代码的执行。

于 2013-02-28T14:05:56.257 回答