【发布时间】:2013-02-28 13:56:21
【问题描述】:
经过长时间的调试,我发现我的应用程序可能将错误的值写入地址 0x5b81730。我想知道我的代码的哪一部分是这样做的。
前段时间,当我使用 Windows XP 时,这会很容易。我会在调试器(MS Visual Studio 2005)中重新启动我的应用程序,在该地址设置一个数据断点,然后调试器会指向我的违规代码。
现在,在我切换到 Windows 7 之后,这似乎是不可能的(或者至少非常困难)。当我运行我的应用程序时,我发现每次堆中同一对象的地址都略有不同(例如,一次运行是 0x53b71b4,而另一次运行是 0x55471b4)。
我听说 Windows 7 有 ASLR,这可能是我看到这些地址变化的原因。
那么我该怎么做才能继续使用我的调试技术?
我应该关闭 ASLR 吗? (我相信这是可能的,但不知道怎么做)
或者我的问题是由其他原因引起的,而不是 ASLR?
或者我应该忘记使用数据断点的便利,而使用其他一些技术?
【问题讨论】:
-
这似乎是由 ASLR 引起的(这是正确的缩写吗?)。你不应该拒绝它,而不是忍受它。最后,如果你不使用它,它可能会把事情搞砸。
-
@bash.d [需要引用]!你能证明禁用 ASLR 会导致问题(或“扰乱”)吗?我非常确定它不能,并且在调试孤立的问题时将其关闭是个好主意。 (当然,出于安全原因,为发布版本重新打开它可能是个好主意。)
-
如果 ASLR 正在“破坏”您的代码,那么您的代码中很可能存在需要修复的问题。
标签: c++ debugging windows-7 memory-corruption aslr