写这篇博客的诱因呢是由于自己在编撰基于Nginxc盘缓存管理程序,目前早已步入测试阶段,关于这个程序的测试分为几个主要步骤:
1.显存管理是否正确(由于这个程序本身开辟好多显存空间进行缓存管理,同时这个程序程序本身就是基于C/C++开发的,显存管理机制仍然是程序员呕吐的东西)
2.程序的健硕性怎么(服务器任何程序的基本要求就是要满足高并发的要求,也就是说linux内存泄漏检测工具,假如达不到这个基本要求,程序并并不能成为服务器)
针对第一点,以下将介绍几款显存泄露检测工具
工具描述
valgrind一个强悍开源的程序检查工具
mtraceGNU扩充,拿来跟踪malloc,mtrace为显存分配函数(malloc,rellaoc,memalign,free)安装hook函数
dmalloc用于检测C/C++显存泄露的工具,即是检测是否存在程序运行结束还没有释放的显存,以一个运行库发布
memwatch和dmalloc一样linux内存泄漏检测工具,它能测量未释放的显存、同一段显存被释放多次、位址存取错误及不当使用未分配之显存区域
mpatrol一个跨平台的C++显存泄露检查器
dbgmem也是一个动态库发布的方式,优点类似dmalloc,并且相比之下,可能特征少了一些
ElectricFence不仅仅才能跟踪malloc()和free(),同时还能检测读访问以及写入,才能确切强调造成错误的指令
Valgrind解读
Valgrind包括以下一些工具:
1.Memcheck:这是valgrind应用最广泛的工具,一个重量级的显存检测器,就能给发觉开发中绝大多数的显存错误使用的情况,例如:使用未初始化
2.callgrind:它主要拿来检测程序中函数中调用过程中出现的问题
3.cachegrind:它主要拿来检测程序中缓存使用出现的问题
4.Helgrind:它主要拿来检测多线程中出现的竞争问题
5.Massif:它主要拿来检测程序中堆栈使用中出现的问题
6.Extension:可以使用core提供的功能,自己编撰特定的显存调试工具
Linux程序显存空间布局
代码段(.text):这儿储存的是CPU要执行的指令,代码是可共享的,相同的代码在显存中只有一份拷贝,同时这个段是只读的,避免程序因为错误而更改自身指令
初始化数据段(.data)。这儿储存的是程序中须要明晰赋初始值的变量,比如坐落所有函数之外的全局变量:intval=100。须要指出的是,以上两段都是坐落程序的可执行文件中,内核在调用exec函数启动该程序时从源程序文件中读入。
未初始化数据段(.bss)。坐落这一段中的数据linux启动盘制作工具,内核在执行该程序前,将其初始化为0或则null。诸如出现在任何函数之外的全局变量:intsum;以及未初始化或年率为0的全局变量和静态局部变量
堆(Heap)。这个段用于在程序中进行动态显存申请,比如常常用到的malloc,new系列函数就是从这个段中申请显存。
已初始化且年率非0的全局变量和静态局部变量
栈(Stack)。函数中的局部变量以及在函数调用过程中形成的临时变量都保存在此段中。可执行代码、字符串字面值、只读变量。
显存检测原理
Memcheck检查显存问题的原理图:
1.Valid-value表:
对于进程的整个地址空间中的每一字节(byte),都有与之对应的8个bits,对于CPU的每位寄存器,也有一个与之对应的bit向量。这种bits负责记录该字节或则寄存器值是否具有有效的、已经初始化的值
2.Valid-Address表
对于进程整个地址空间中的么一个字节(byte),还有与之对应的1bit,负责记录该地址是否还能被读写。
测量原理
当要读写显存中的某个字节时,首先检测这个字节对应的Abit。假如该Abit显示该位置是无效位置,memcheck则报告读写错误。
内核(core)类似于一个虚拟的CPU的环境,这样当显存中的某个字节被加载到真实的CPU中时,该字节对应的Vbit也被加载到虚拟的CPU环境中,一旦寄存器中的值,被拿来形成显存地址,或则该值才能影响程序的输出,则memcheck会检测对应的vbits,假如该值仍未初始化,则会报告使用未初始化显存错误。
接出来我主要是介绍valgrind的安装和使用,关于其他的工具,你们可以自己上网去查阅资料,感谢配合!
Valgrind安装
1.解压安装包
tar-jxvfvalgrind-3.11.0.tar.bz2-C/usr/local/src
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&&makeinstall
valgrind使用
第一步:打算好程序
为了valgrind发觉的错误更精确,如才能定位到源代码的行,建议在编译时加上-g参数,编译优化选项选择O0(不要优化)
第二步:在valgrind下,运行可执行程序
借助valgrind调试显存问题,不须要重新编译源程序linux删除文件夹,它的输入就是二补码的可执行程序。调用Valgrind的通用格式是:valgrind[valgrind-options]your-prog[your-prog-options]
Valgrind的参数分为两类,一类是core的参数,它对所有的工具都适用;另外一类就是具体某个工具如memcheck的参数。Valgrind默认的工具就是memcheck,也可以通过“–tool=toolname”指定其他的工具。Valgrind提供了大量的参数满足你特定的调试需求,具体可参考其用户指南。
借助Memcheck发觉常见的显存问题总结
Memcheck将显存泄漏分为两种,一种是可能的显存泄漏(Possiblylost),另外一种是确定的显存泄漏(Definitelylost)。Possiblylost是指一直存在某个表针才能访问某块显存,但该表针指向的早已不是该显存首地址。Definitelylost是指早已不能否访问这块显存。而Definitelylost又分为两种:直接的(direct)和间接的(indirect)。直接和间接的区别就是,直接是没有任何表针指向该显存,间接是指指向该显存的表针都坐落显存泄漏处。在上述的事例中,根节点是directlylost,而其他节点是indirectlylost
---------------------