C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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程序的内存访问监视器全部内容,希望文章能够帮你解决c程序的内存访问监视器所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: