? ? ? ?
? ? ? Valgrind由内核(core)以及基于内核的其他调试工具组成.内核类似于一个框架(framework),它模拟了一个CPU环境,并提供服务给其他工具.而其他工具则类似于插件 (plug-in),利用内核提供的服务完成各种特定的内存调试任务。
?
system.jpg?version=1&modificationDate=1303225093000" alt="">
?
Valgrind包括如下一些工具:
1. Memcheck: 这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。这也是本文将重点介绍的部分。
2. Callgrind: 它主要用来检查程序中函数调用过程中出现的问题。
3. Cachegrind: 它主要用来检查程序中缓存使用出现的问题。
4. Helgrind: 它主要用来检查多线程程序中出现的竞争问题。
5. Massif: 它主要用来检查程序中堆栈使用中出现的问题。
6. Extension: 可以利用core提供的功能,自己编写特定的内存调试工具。
?
?
类型1 ?
valgrind结果:
分析:
1.函数中动态申请的堆内存没有释放
2.对堆内存的访问越界
valgrind结果:
分析:程序跳转依赖于一个未初始化的变量
?
?
类型3
valgrind结果:
分析:非法读,非法写,如访问数组时越界,对动态内存访问时超出了申请的内存大小范围
?
类型4
valgrind结果:
分析:使用strcpy, strncpy, memcpy, strcat等时源地址和目标地址设置出现重叠
?
类型5
valgrind结果:
分析:内存动态管理错误,包括申请和释放不一致,申请和释放不匹配,释放后仍然读写
?
类型6
valgrind结果:
分析:内存泄露. Memcheck将内存泄露分为两种,一种是可能的内存泄露(Possibly lost),另外一种是确定的内存泄露(Definitely lost)。Possibly lost 是指仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内存首地址。Definitely lost 是指已经不能够访问这块内存。而Definitely lost又分为两种:直接的(direct)和间接的(indirect)。直接和间接的区别就是,直接是没有任何指针指向该内存,间接是指指向该内存的 指针都位于内存泄露处。
?
(本文参考了IBM,valgrind官网的技术资料,总结而成。)