【问题标题】:How to force OS (Windows) to allocate same addresses to my program for each debug session?如何强制操作系统(Windows)为每个调试会话为我的程序分配相同的地址?
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-02-11
      • 2012-10-29
      • 2014-05-27
      • 1970-01-01
      • 2018-02-05
      • 2011-12-07
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多