如何从 Linux 上的 Intel Pin 获取地址 space 布局?
How to get address space layout from Intel Pin on Linux?
我想从 Linux 上的 Intel Pin 获取地址 space 布局。
首先,我尝试读取文件 - /proc/PID/maps
并获取地址 space 布局。但是你什么时候执行这部分代码?
如果你把它放在PIN_StartProgram
之前,地图文件将不会包含一些区域,比如heap
;
如果放在Fini
里,用PIN_AddFiniFunction(Fini, 0);
钩住,应该不错。但是,当您仅跟踪一次 ls
执行时,您看不到任何与输出相关的地址 space 布局。那是有线的。
Pin 有更细粒度的方法来解决 space 布局。您可以使用 IMG_AddInstrumentFunction()
获取图像加载的回调,并通过使用 RTN_Replace()
检测 malloc()
和 free()
调用或什至检测 mmap()
来获取堆分配的回调,brk()
和其他用于堆分配的系统调用 PIN_AddSyscallEntryFunction()
.
您可以在 Pin 教程和 Pin 套件中的示例中找到使用这些 API 的示例。
也许不是最好的解决方案,但它对我有用。主要问题是当工具启动时,地址 space 还没有准备好。您可以等到所有图像加载完毕,然后读取procfs 的内容。
所以你应该为每个图像添加一个检测函数。例如在main函数中加入如下语句:
IMG_AddInstrumentFunction(Image, 0);
那么你应该在每次加载图像时阅读 procfs。这是因为你不知道最后加载的是哪张图片(当然,如果你知道最后一张是哪张图片,你可以简单地只读一次文件,在加载完那张图片后):
VOID Image(IMG img, VOID *v)
{
...
/* open /proc/PID/maps and read its contents */
...
}
在程序执行过程中,你总是有地址space的最新映射,一切都会好起来的。尽管如此,您应该始终注意运行时布局修改,以及使用 brk()
系统调用增加堆大小等情况。
我想从 Linux 上的 Intel Pin 获取地址 space 布局。
首先,我尝试读取文件 - /proc/PID/maps
并获取地址 space 布局。但是你什么时候执行这部分代码?
如果你把它放在PIN_StartProgram
之前,地图文件将不会包含一些区域,比如heap
;
如果放在Fini
里,用PIN_AddFiniFunction(Fini, 0);
钩住,应该不错。但是,当您仅跟踪一次 ls
执行时,您看不到任何与输出相关的地址 space 布局。那是有线的。
Pin 有更细粒度的方法来解决 space 布局。您可以使用 IMG_AddInstrumentFunction()
获取图像加载的回调,并通过使用 RTN_Replace()
检测 malloc()
和 free()
调用或什至检测 mmap()
来获取堆分配的回调,brk()
和其他用于堆分配的系统调用 PIN_AddSyscallEntryFunction()
.
您可以在 Pin 教程和 Pin 套件中的示例中找到使用这些 API 的示例。
也许不是最好的解决方案,但它对我有用。主要问题是当工具启动时,地址 space 还没有准备好。您可以等到所有图像加载完毕,然后读取procfs 的内容。
所以你应该为每个图像添加一个检测函数。例如在main函数中加入如下语句:
IMG_AddInstrumentFunction(Image, 0);
那么你应该在每次加载图像时阅读 procfs。这是因为你不知道最后加载的是哪张图片(当然,如果你知道最后一张是哪张图片,你可以简单地只读一次文件,在加载完那张图片后):
VOID Image(IMG img, VOID *v)
{
...
/* open /proc/PID/maps and read its contents */
...
}
在程序执行过程中,你总是有地址space的最新映射,一切都会好起来的。尽管如此,您应该始终注意运行时布局修改,以及使用 brk()
系统调用增加堆大小等情况。