C++ 如何强制操作系统(Windows)为每个调试会话为我的程序分配相同的地址?

C++ 如何强制操作系统(Windows)为每个调试会话为我的程序分配相同的地址?,c++,debugging,windows-7,memory-corruption,aslr,C++,Debugging,Windows 7,Memory Corruption,Aslr,经过长时间的调试,我发现我的应用程序可能向地址0x5b81730写入了错误的值。我想知道我的代码的哪一部分可以做到这一点 不久前,当我使用Windows XP时,这将非常简单。我将在调试器(MSVisualStudio2005)中重新启动我的应用程序,在该地址设置一个数据断点,调试器将指向有问题的代码 现在,在我切换到Windows7之后,这似乎是不可能的(或者至少是非常困难的)。当我运行应用程序时,我发现每次堆中相同对象的地址都略有不同(例如,一次运行0x53b71b4,而另一次运行0x554

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

不久前,当我使用Windows XP时,这将非常简单。我将在调试器(MSVisualStudio2005)中重新启动我的应用程序,在该地址设置一个数据断点,调试器将指向有问题的代码

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

我听说Windows7有,这可能是我在地址中看到这些变化的原因

那么,我可以做些什么来继续使用我的调试技术呢

我应该关闭ASLR吗?(我相信这是可能的,但无法找到如何做到)

或者我的问题是由其他原因引起的,而不是ASLR


或者我应该忘记使用数据断点的便利性,而使用其他一些技术吗?

如果您使用的是类似UB的东西,则根本无法保证地址是什么。你不能指望它每次都是一样的

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


命令行语法是
/DYNAMICBASE:NO
。它在VisualStudio2005中不存在,但在VS2012和更高版本中确实存在。

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

您尝试过吗?这似乎是由ASLR引起的(这是正确的缩写吗?)。你不应该放弃它,而应该接受它。最后,如果你不使用它,它可能会把事情搞得一团糟。@bash.d[需要引用]!你能证明禁用ASLR会导致问题(或“混乱”)吗?我非常确信它不能,并且在调试一个孤立的问题时关闭它是一个好主意。(当然,出于安全考虑,在发布版本中重新启用它可能是个好主意。)如果ASLR正在“破坏”您的代码,那么您的代码中很可能存在需要修复的问题。