c程序的内存访问监视器

我正在尝试追踪内存访问堆分配的内存.

例如,如果我有以下代码

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修改内存的保护,并写入页面错误的处理程序.我使内存为只读,而当写入发生时,处理程序会修改页面保护,并让该功能内容写入内存,但之后我无法再次读取该页面,以供进一步访问.

有没有关于如何监视对堆内存的每次写入的任何提示

解决方法

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

由于在特定情况下,仪器仪表可能会耗费大量成本,因此您可以对每个指令进行设置,并且可以负担得起采样内存引用,建议您从最近的英特尔处理器(AMD处理器中有类似的命名为IBS)探索PEBS基础设施[3].可以从Linux OS [4]中可用的perf工具使用PEBS(我不知道是否在其他OSeS上可用)

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

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

[3] Intel手册第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/

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...