【问题标题】:How to make memory allocation in MSVC C++ deterministic?如何使 MSVC C++ 中的内存分配具有确定性?
【发布时间】:2016-05-03 15:27:41
【问题描述】:

在使用大量指针调试一些 C++ 代码时,如果运行之间的内存地址相同,那将很有用。有没有办法使在执行相同内存分配的程序的连续运行之间返回的一系列地址具有确定性?

也许是一个环境变量或可以为调试堆设置的东西?

我知道您希望发布版本随机化有很多充分的理由,但确定性在某些情况下对调试很方便(例如,在修改图表时某些东西没有正确链接)。

【问题讨论】:

  • “有没有什么办法可以使执行相同内存分配的程序连续运行之间返回的一系列地址具有确定性?”恐怕没有这不是从程序的重复运行中获取相同地址的方法。
  • 我同意@πάνταῥεῖ。在请求内存时,无论是从静态存储还是动态存储,您都受操作系统的支配。如果它在不同的地址加载您的程序并在您请求内存时为您提供不同的地址,那么您的程序将无能为力。
  • 地址空间布局随机化很可能是最大的原因。 en.wikipedia.org/wiki/…
  • 在 Windows 上禁用 ASLR:stackoverflow.com/questions/9560993/…
  • 您可能想要替换operator new。在您自己的版本中,创建一个大内存映射(显然这需要 x64)并从此块顺序分配。

标签: c++ visual-studio memory allocation deterministic


【解决方案1】:

有一个特殊的调试堆用于执行额外的检查并写入特殊值。

不,没有像调试堆这样的东西,而是准备布局和金丝雀的调试堆管理器额外检查特殊值只是在调试模式下编译的代码的结果。从操作系统获得的地址仍然是任意的。

有什么方法可以确定在执行相同内存分配的程序的连续运行之间返回的一系列地址?

不,无论您是在运行调试版本还是发布版本,都无法为重复执行程序获取相同的地址。

【讨论】:

【解决方案2】:

(从评论转换)

您可能想要替换 operator new。在您自己的版本中,在固定基地址创建单个大内存映射。在 64 位地址空间中空闲的可能性 > 99%。然后只需从此块顺序分配。

【讨论】:

    猜你喜欢
    • 2021-08-10
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    相关资源
    最近更新 更多