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

时间:2015-01-25 19:04:59

标签: linux gdb valgrind trace

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

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

x86调试寄存器是理想的,但遗憾的是我只能同时观看4个地址,而且还需要更多地址。

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

如果没有这个,是否有更合理的方式来记录对许多地址的访问?也许在valgrind的东西?感谢

1 个答案:

答案 0 :(得分:2)

  

我以为我可以暂时让每个成员占据整个页面,

这仅适用于堆分配的对象,是Electric Fence使用的。在过去,我发现电围栏的开销非常大,除了玩具程序之外什么都不可用。

  

如果没有这个,是否有更合理的方式来记录对许多地址的访问?在valgrind中可能有什么东西?

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

更好的方法可能是使用Pin tool代替。