一、Valgrind (https://www.valgrind.org/)
Valgrind 是一个框架,基于这个框架可以开发自定义的 分析程序 各个部分的独立工具。譬如:监测内存管理、线程运行,cache、堆内存的分配释放、线程锁、线程共享内存的非同步访问。当发生程序异常:内存泄漏、访问野指针、死锁、内存共享内存在未加锁时访问 等等 valgrind 工具 会 记录当前的调用栈、已经异常访问的代码函数。通过这个信息,可以节省时序bug、内存泄漏、野指针 几个小时的debug时间。
当前Valgrind工具包已经成熟的7个工具:
1个内存错误检测
2个线程错误监测
1个cache 和 branch-prediction profiler
1个call-graph generating cache and branch-prediction profiler
2个不同的heap profilers
其他的工具,正在开发工程中。。。
Valgrind 开源免费, 基于 GNU General Public License, version 2协议。
二、工具介绍
1. Memcheck
检测内存管理方面的问题。主要针对C和C++ 程序。memcheck 会监测内存每一次的读和写,会监测 malloc/new/free/delete的执行。so, memcheck 可以监测如下问题:
- 访问不应该访问的内存(包括未分配的内存、已经释放的内存、堆之外的内存、不可访问的栈区)
- 使用未初始化的值
- 内存泄漏
- 错误的内存释放(重复释放、释放没有申请的内存)
- memcpy 或相关内存操作的函数,源和目的的地址重叠
上述现象发生时,memcheck 会记录 发生问题的代码行,函数调用栈信息。
memcheck 监测内存是在bit级别的。运行时 程序会比正常执行慢10-30倍。
2. Massif
Massif 是一个 堆内存分析工具。Massif 会执行周期性的堆内存分析,并记录下来。通过图表的形式 展示 堆的动态使用、程序的哪个部分执行最多的堆分配。 通过这个工具可以从内存使用的角度优化程序。
运行Massif时,程序比正常执行慢20倍。
3. DHAT
DHAT 解释程序如何使用了它的堆内存。DHAT 跟踪已经分配的块,并且观察每一个内存访问动作访问了哪块内存。DHAT会提供一个GUI界面展示分析的结果。
4. Helgrind
Helgrind 线程调试器,用来发现多线程的数据竞态访问。Helgrind 查找出 被多于一个线程(符合POSIX-X标准的线程)访问但没有用同步锁去锁(pthread_mutex_)的内存。
所以可以发现 未加锁导致的 时序问题。 (工具还处于实验阶段,大部分功能都ok,但是不排除错误)
5. DRD
DRD 也是一个C/C++程序的线程调试器。线程 需要符合 POSIX 标准。DRD可以监测到锁顺序异常的问题。
6. Cachegrind 和 Callgrind
分析l1、D1和L2 cache 访问相关。(当前工作接触的不多,不关注呢 ^_^)
7. Lackey, Nulgrind
没什么实际用途,为了测试和演示的目的。
8. 其他一些 处于实验阶段的工具
BBV、SGCheck ....
reference:
1. Valgrind home page:https://www.valgrind.org/
2. valgrind 开源代码:https://sourceware.org/git/?p=valgrind.git
3. valgrind 工具包:https://www.valgrind.org/info/tools.html