【问题标题】:How to get address space layout from Intel Pin on Linux?如何在 Linux 上从 Intel Pin 获取地址空间布局?
【发布时间】:2018-02-27 04:29:04
【问题描述】:

我想从 Linux 上的 Intel Pin 获取地址空间布局。

首先,我尝试读取文件 - /proc/PID/maps 并获取地址空间布局。但是你什么时候执行这部分代码呢?

如果你把它放在PIN_StartProgram之前,地图文件将不会包含一些区域,比如heap;

如果你把它放在Fini中,并与PIN_AddFiniFunction(Fini, 0);挂钩,它应该是好的。但是,当您只跟踪一次ls 执行时,您看不到任何与输出相关的地址空间布局。那是有线的。

【问题讨论】:

  • 你说的“输出相关地址空间布局”是什么意思?

标签: linux intel-pin


【解决方案1】:

也许不是最好的解决方案,但它对我有用。主要问题是当工具启动时,地址空间还没有准备好。你可以等到所有图片都加载完毕后再读取procfs的内容。

因此,您应该为每个图像添加一个检测功能。例如,在 main 函数中添加如下语句:

IMG_AddInstrumentFunction(Image, 0);

然后,您应该在每次加载图像时阅读 procfs。这是因为您不知道最后加载的图像是哪张图像(当然,如果您知道哪张图像是最后一张,则可以在加载该图像后只读取一次文件):

VOID Image(IMG img, VOID *v)
{
    ...
    /* open /proc/PID/maps and read its contents */
    ...
}

在程序执行期间,您始终拥有最新的地址空间映射,一切都会好起来的。尽管如此,您应该始终小心运行时布局修改,例如使用brk() 系统调用增加堆大小的情况。

【讨论】:

    【解决方案2】:

    Pin 具有更细粒度的地址空间布局方法。您可以使用IMG_AddInstrumentFunction() 获取图像加载回调,并通过使用RTN_Replace() 检测malloc()free() 调用,甚至使用@ 检测mmap()brk() 和其他用于堆分配的系统调用来获取堆分配回调987654327@.

    您可以在 Pin 教程和 Pin 工具包中找到使用这些 API 的示例。

    【讨论】:

      猜你喜欢
      • 2018-09-26
      • 2011-09-29
      • 1970-01-01
      • 2014-11-13
      • 2020-04-18
      • 1970-01-01
      • 2014-11-24
      • 2021-01-07
      • 1970-01-01
      相关资源
      最近更新 更多