Linux/C : how to trace the accesses on a number of variables

标签 linux gdb valgrind trace

我正在尝试分析一些现有的 C 代码,这些代码使用具有许多成员的大型结构,目的是将其重构为一个较小的缓存友好核心结构,其中包含最常访问的成员和指向较冷数据的指针。

我想想出一种方法,在几个用例中监控应用程序几个小时,并生成一份报告,说明结构实例中每个成员的访问频率。

x86 调试寄存器是理想的,但不幸的是我只能同时观察 4 个地址,我需要更多。

我想我可以暂时让每个成员占据自己的整个页面,将所有页面标记为不可访问,然后设置一个段错误处理程序来记录每次访问,然后以某种方式(这是棘手的一点)恢复并允许该应用程序继续。没有任何被监视的内存被传递给系统调用,因此系统调用不会因不可读的参数而失败。有没有办法使用处理程序暂时使页面可访问,执行错误指令,重新保护页面,然后返回?

如果做不到这一点,是否有更明智的方法来记录对许多地址的访问?也许是在 valgrind 里?谢谢

最佳答案

I was thinking I could temporarily make each member occupy a whole page of its own,

这只适用于堆分配的对象,这就是 Electric Fence使用。过去,我发现 Electric Fence 开销太大,除了玩具程序外,它无法用于任何其他用途。

Failing this, is there a more sensible way of recording accesses to many addresses? Something in valgrind maybe?

这可以通过编写自定义 Valgrind 工具来实现,但这是一个复杂的命题。

更好的方法可能是使用 Pin tool相反。

关于Linux/C : how to trace the accesses on a number of variables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28140266/

相关文章:

c - 如何检测当前进程是否正在由 GDB 运行

c++ - 如何解释 Valgrind 输出

条件跳转或移动取决于未初始化的值 - C valgrind

python - 如何从 linux 中的打印输出中获取一行?

c++ - 为什么会出现此错误? void* 不是指向对象类型的指针。

node.js - nodejs,如何使用 GDB 进行调试

计算 valgrind 错误而不报告它们

linux - 使变量包含直接在其之前运行的命令的标准输出中的所有数字

python - 使用python中的函数从系统中注销用户

c++ - 如何将 strip 与 split-dwarf 结合使用?