Linux/C:如何跟踪对多个变量的访问

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

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

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

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

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

如果做不到这一点,是否有更明智的方法来记录对许多地址的访问?也许是在 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