2

我正在试验Pin,一种检测工具,我用它来根据我的变量的内存地址计算一些统计数据。我想用我的检测工具收集的信息重新运行我的程序,但为此,虚拟内存地址在不同的运行中保持相同是至关重要的。

一般来说,我应该让操作系统处理内存分配,但在这种情况下,我需要某种方式来强制它始终分配给相同的虚拟地址。特别是,我对一个非常长的数组感兴趣,我目前正在分配它numa_alloc_onnode(),尽管我可以使用其他东西。

正确的方法是什么?

谢谢

4

2 回答 2

3

你可以试试 mmap(2)。

程序的插桩版本将使用与原始程序不同的内存布局,因为 pin 需要用于动态翻译等的内存,并且会改变内存布局。(如果我没记错的话)

于 2014-01-14T01:48:21.197 回答
2

除了地址空间布局随机化之外,大多数用于分配虚拟内存地址的内存分配器、加载器和系统例程将在相同的调用和数据的情况下返回相同的结果(不是故意设计的,而是软件工作方式的自然结果) . 因此,您需要:

  • 禁用地址空间布局随机化。
  • 确保您的程序每次都以相同的方式执行。

地址空间布局随机化是故意更改地址空间以挫败攻击者:如果在每个程序执行中更改地址,则攻击者更难以使用各种漏洞来控制执行的代码。它应该只暂时禁用并且仅用于调试目的。此答案显示了一种执行此操作的方法并链接到更多信息,但确切的方法可能取决于您使用的 Linux 版本。

由于各种原因,您的程序可能会以不同的方式执行,例如使用线程或使用异步信号或进程间通信。您可以在程序中控制它。

通常,不能保证内存分配是可重现的。您获得的结果可能是基于原样的。

于 2014-01-14T01:25:24.993 回答