我希望记录对堆中分配的块中由给定指针指向的地址的所有访问。在以下示例中,它将监视从
p
开始的所有对 1024 字节的访问。
#define BLK 1024
#include <stdlib.h>
int monfun(int *p){
int t;
for(int i=0; i<BLK; i++){
t=p[i];
}
return t;
}
int main(void){
int *p=(int*)malloc(BLK);
int *p = a;
monfun(p);
return 0;
}
并获得类似的东西:
w 4b 0x12345
r 4b 0x12346
r 8b 0x12348
...
性能不是问题。这可能会大大减慢执行速度,并且需要大量额外的内存。相反,我正在寻找精确的测量结果。
我一直在探索
valgrind
,它的massif
工具给了我一棵带有分配/空闲对的树。我一直在网上读到 valgrind 可以做我需要的事情,但我只能访问 counters 而不是触摸地址的实际序列。
我读过其他工具,例如radare2,qemu-mtrace,valgrind的
tracegrind
插件(适用于v3.15。我有v3.21),intel的pin,但目前我不确定哪个工具/手册为了完成这件事而投入我的学习。
如果这可以用 valgrind 来完成,你能指导我如何实现它吗?
除了 valgrind 和调试器监视之外,另一个选项是 asan(用于 GCC 和 LLVM/clang)。
地址清理程序通常会查找内存错误,但有可能:
-fsanitize-recover=address
,ASAN_OPTIONS=halt_on_error=0