c程序的内存访问监视器

时间:2016-01-08 15:08:07

标签: c memory heap-memory

我正在尝试跟踪对堆分配内存的内存访问。

例如,如果我有以下代码:     

void set_value(int* buffer, size_t pos, int value) {
    buffer[pos] = value;
}
int main(void) {    
    int* buffer = malloc(BUFF_SIZE * sizeof(int));
    set_value(buffer, 2, 10);
    set_value(buffer, 3, 12);

    free(buffer);
    return 0;
}

我主要感兴趣的是访问内存的函数和已修改内容的地址。

我尝试使用多种内存工具,例如 ptrace strace ASan Dmalloc ,但我没有达到结果。

另一个想法是使用 mprotect 修改内存更改内存保护,并为页面错误编写处理程序。我将内存设置为只读,当发生写入时,处理程序修改页面保护并让函数将内容写入内存,但之后我无法再次读取页面,以便进一步访问。

您是否有关于如何监控对堆内存的每次写入的任何提示?

1 个答案:

答案 0 :(得分:1)

如果您愿意监控每次内存访问,我建议您查看PIN [1]和/或DynInst [2]等软件包。两者都是动态二进制检测包,允许您修改应用程序二进制文件以注入所需的代码。在这种情况下,这两个工具都允许您检测每条指令并知道它们引用的地址(如果它们是加载/存储)。然后,如果您只对malloc(或realloc或calloc)分配的内存感兴趣,您还可以检测这些例程以捕获其入口参数并退出值以确定感兴趣的内存区域。这两种工具都提供类似的功能。我说它们的主要区别在于PIN特别关注英特尔处理器,而DynInst是一个开源项目,支持不同的处理器架构(英特尔,IBM-Power,ARM)。

由于在这种特殊情况下仪器可能成本很高,可以检测每条指令并且您可以负担得起内存参考样本,我建议您探索最近英特尔处理器的PEBS基础设施[3](AMD处理器有类似的东西)名为IBS)。 PEBS可以在Linux OS中使用的perf工具中使用[4](我不知道它是否可以在其他OSeS上使用)

[1] PIN https://software.intel.com/en-us/articles/pin-a-dynamic-binary-instrumentation-tool

[2] DynInst http://www.dyninst.org

[3]英特尔手册第18.4.4节基于精确事件的采样(PEBS)http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3b-part-2-manual.pdf

[4] Linux perf采样内存地址https://lwn.net/Articles/531766/

相关问题