如何跟踪对内存块的所有访问?

问题描述 投票:0回答:1

我希望记录对堆中分配的块中由给定指针指向的地址的所有访问。在以下示例中,它将监视从

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 来完成,你能指导我如何实现它吗?

c memory heap-memory valgrind trace
1个回答
0
投票

除了 valgrind 和调试器监视之外,另一个选项是 asan(用于 GCC 和 LLVM/clang)。

地址清理程序通常会查找内存错误,但有可能:

  • 手动毒害内存区域,
  • 使用
    -fsanitize-recover=address
    ,
  • 进行编译
  • 然后使用
    ASAN_OPTIONS=halt_on_error=0
  • 运行代码
© www.soinside.com 2019 - 2024. All rights reserved.