valgrind提供了一个用于编写动态分析工具的框架。该框架目前已经实现了一些标准的动态分析工具,包括:
- MemCheck, 用于检测内存错误。
- Cachegrind, 用于分析cache和分支预测情况。
- Callgrind, 可以用于交互式地分析函数的动态调用过程。
- Helgrind和DRD, 用于检测线程错误。
- Massif和DHAT, 用于分析堆的使用。
- Ptrcheck,用于检测heap、stack和全局数组的overflow。
- BBV,是一个类似SimPoint的分析工具,可以辅助系统体系结构的研究。
先试图猜一下各种工具的实现思路,等以后有机会看过源码, 再来纠正。
1. MemCheck
内存错误包括,数组越界访问,段错误等。除了内存错误以外,常见的问题还包括内存泄漏。内存相关问题大部分是由于寻址引起的,而指针类型作为能够修改地址,因而经常是很多内存问题的根源。指针相关地问题,包括访问未初始化指针,指针运算越界,内存泄漏等。
检测数组越界,应该可以通过在数组访问前,将数组索引变量的值与数组定义时的长度进行比较来实现。
检测段错误,应该可以通过段的属性标志来部分实现。
检测访问未初始化指针,应该用静态分析方法。
检测内存泄漏,应该是访问堆管理器的接口实现。
2. Cachegrind
分支预测情况,可以通过访问相关的硬件计数器实现。
cache的命中情况,也可以通过访问相应的硬件计数器实现。
3. Callgrind
函数的调用过程,可以通过访问活跃记录的链接来实现。
4. 指令和数据profiling
可以在执行每条指令前,打印出当前地IP值得到指令的逻辑地址profiling。如果要得到指令的物理地址的profiling,则需要访问TLB——对TLB接口尚无概念。如何得到数据的逻辑地址?如果要得到数据的物理地址profiling,则同样要访问TLB。