我正在尝试分析一些现有的 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/