分享几款Linux 下C/C++程序内存泄漏检查工具

  • 1.内存管理是否正确(因为这个程序本身开辟很多内存空间进行缓存管理,同时这个程序程序本身就是基于C/C++开发的,内存管理机制一直是程序员头痛的东西)
  • 2.程序的健硕性如何(服务器任何程序的基本要求就是要满足高并发的要求,也就是说,如果达不到这个基本要求,程序并并不能成为服务器)
针对第一点,以下将介绍几款内存泄漏检查工具
分享几款Linux 下C/C++程序内存泄漏检查工具

文章插图
 
Valgrind详解
分享几款Linux 下C/C++程序内存泄漏检查工具

文章插图
 
Valgrind包括以下一些工具:
1.Memcheck:这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够给发现开发中绝大多数的内存错误使用的情况,比如:使用未初始化
2.callgrind:它主要用来检查程序中函数中调用过程中出现的问题
3.cachegrind:它主要用来检查程序中缓存使用出现的问题
4.Helgrind:它主要用来检查多线程中出现的竞争问题
5.Massif:它主要用来检查程序中堆栈使用中出现的问题
6.Extension:可以使用core提供的 功能,自己编写特定的内存调试 工具
linux程序内存空间布局
分享几款Linux 下C/C++程序内存泄漏检查工具

文章插图
 
  • 代码段(.text):这里存放的是CPU要执行的指令,代码是可共享的,相同的代码在内存中只有一份拷贝,同时这个段是只读的,防止程序由于错误而修改自身指令
  • 初始化数据段(.data) 。这里存放的是程序中需要明确赋初始值的变量,例如位于所有函数之外的全局变量:int val=100 。需要强调的是,以上两段都是位于程序的可执行文件中,内核在调用exec函数启动该程序时从源程序文件中读入 。
  • 未初始化数据段(.bss) 。位于这一段中的数据,内核在执行该程序前,将其初始化为0或者null 。例如出现在任何函数之外的全局变量:int sum;以及未初始化或初值为0的全局变量和静态局部变量
  • 堆(Heap) 。这个段用于在程序中进行动态内存申请,例如经常用到的malloc,new系列函数就是从这个段中申请内存 。已初始化且初值非0的全局变量和静态局部变量
  • 栈(Stack) 。函数中的局部变量以及在函数调用过程中产生的临时变量都保存在此段中 。可执行代码、字符串字面值、只读变量 。
内存检查原理Memcheck检测内存问题的原理图:
分享几款Linux 下C/C++程序内存泄漏检查工具

文章插图
 
1.Valid-value表:
对于进程的整个地址空间中的每一字节(byte),都有与之对应的8个bits,对于CPU的每个寄存器,也有一个与之对应的bit向量 。这些bits负责记录该字节或者寄存器值是否具有有效 的、已经初始化的值
2.Valid-Address表
对于进程整个地址空间中的 么一个字节(byte),还有与 之对应的1bit,负责记录该地址是否能够被读写 。
检测原理
当要读写内存中的某个字节时,首先检查这个字节对应的A bit 。如果该A bit显示该位置是无效位置,memcheck则报告读写错误 。
内核(core)类似于 一个虚拟的CPU的环境,这样当内存中的某个字节被加载到真实的CPU中时,该字节对应的V bit也被加载到虚拟的CPU环境中,一旦寄存器中的值,被用来产生内存地址,或者该值能够影响程序 的输出,则memcheck会检查对应的vbits,如果该值尚未初始化,则会报告使用未初始化内存错误 。
接下来我主要是介绍valgrind的安装和使用,关于其他的工具,大家可以自己上网去查阅资料,谢谢配合!
Valgrind 安装1.解压安装包
tar -jxvf valgrind-3.11.0.tar.bz2 -C /usr/local/src
【分享几款Linux 下C/C++程序内存泄漏检查工具】2.进入目录安装
cd /usr/local/src/valgrind-3.11.0
3.运行./autogen.sh 设置环境(需要标准的autoconf工具)
./autogen.sh
4.配置Valgrind,生成MakeFile文件
./configure --prefix=/usr/local
5.编译和安装valgrind
make && make install
valgrind 使用第一步:准备好程序
为了valgrind发现的错误更精确,如能够定位到源代码的行,建议在编译时加上-g参数,编译优化选项选择O0(不要优化)
第二步:在valgrind下,运行可执行程序
利用valgrind调试内存问题,不需要重新编译源程序,它的输入就是二进制的可执行程序 。调用Valgrind的通用格式是:valgrind [valgrind-options] your-prog [your-prog-options]


推荐阅读