微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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/

原文地址:https://www.jb51.cc/c/114051.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐