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修改内存的保护,并写入页面错误的处理程序.我使内存为只读,而当写入发生时,处理程序会修改页面保护,并让该功能将内容写入内存,但之后我无法再次读取该页面,以供进一步访问.
有没有关于如何监视对堆内存的每次写入的任何提示?
解决方法
由于在特定情况下,仪器仪表可能会耗费大量成本,因此您可以对每个指令进行设置,并且可以负担得起采样内存引用,建议您从最近的英特尔处理器(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 举报,一经查实,本站将立刻删除。