前端之家收集整理的这篇文章主要介绍了
Centos下Valgrind使用与安装,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
第一步:
获取Valgrind 包 可以先使用浏览器访问http://valgrind.org/downloads/查看当前版本
wget http://valgrind.org/downloads/valgrind-3.10.1.tar.bz2
第二步:
将下载的文件解压
tar -jxvf valgrind-3.10.1.tar.bz2
第三步:
安装和配置
./autogen.sh
./configure
make; make install
Linux下利用Valgrind工具进行内存泄露检测和性能分析
Valgrind通常用来成分析程序性能及程序中的内存泄露错误
一Valgrind工具集简绍
Valgrind包含下列工具:
1、memcheck:检查程序中的内存问题,如泄漏、越界、非法指针等。
2、callgrind:检测程序代码的运行时间和调用过程,以及分析程序性能。
3、cachegrind:分析cpu的cache命中率、丢失率,用于进行代码优化。
4、helgrind:用于检查多线程程序的竞态条件。
5、massif:堆栈分析器,指示程序中使用了多少堆内存等信息。
6、lackey:
7、nulgrind:
这几个工具的使用是通过命令:valgrand --tool=name 程序名来分别调用的,当不指定tool参数时默认是--tool=memcheck
二Valgrind工具详解
1.Memcheck
最常用的工具,用来检测程序中出现的内存问题,所有对内存的读写都会被检测到,一切对malloc、free、new、delete的调用都会被捕获。所以,它能检测以下问题:
1、对未初始化内存的使用;
2、读/写释放后的内存块;
3、读/写超出malloc分配的内存块;
4、读/写不适当的栈中内存块;
5、内存泄漏,指向一块内存的指针永远丢失;
6、不正确的malloc/free或new/delete匹配;
7、memcpy()相关函数中的dst和src指针重叠。
这些问题往往是C/C++程序员最头疼的问题,Memcheck能在这里帮上大忙。
例如:
- #include<stdlib.h>
- #include<malloc.h>
- #include<string.h>
- voidtest()
- {
- int*ptr=malloc(sizeof(int)*10);
- ptr[10]=7;//内存越界
- memcpy(ptr+1,ptr,5);//踩内存
- free(ptr);
- free(ptr);//重复释放
- int*p1;
- *p1=1;//非法指针
- }
- intmain(void)
- test();
- return0;
- }
将程序编译生成可执行文件后执行:valgrind --leak-check=full ./程序名
输出结果如下:
==4832==Memcheck,amemoryerrordetector
==4832==Copyright(C)2002-2010,andGNUGPL'd,byJulianSewardetal.
==4832==UsingValgrind-3.6.1andLibVEX;rerunwith-hforcopyrightinfo
==4832==Command:./tmp
==4832==
==4832==Invalidwriteofsize4//内存越界
==4832==at0x804843F:test(in/home/yanghao/Desktop/testC/testmem/tmp)
==4832==by0x804848D:main(in/home/yanghao/Desktop/testC/testmem/tmp)
==4832==Address0x41a6050is0bytesafterablockofsize40alloc'd
==4832==at0x4026864:malloc(vg_replace_malloc.c:236)
==4832==by0x8048435:test(in/home/yanghao/Desktop/testC/testmem/tmp)
==4832==Sourceanddestinationoverlapinmemcpy(0x41a602c,0x41a6028,5)//踩内存
==4832==at0x4027BD6:memcpy(mc_replace_strmem.c:635)
==4832==by0x8048461:test(in/home/yanghao/Desktop/testC/testmem/tmp)
==4832==by0x804848D:main(in/home/yanghao/Desktop/testC/testmem/tmp)
==4832==
==4832==Invalidfree()/delete/delete[]//重复释放
==4832==at0x4025BF0:free(vg_replace_malloc.c:366)
==4832==by0x8048477:test(in/home/yanghao/Desktop/testC/testmem/tmp)
==4832==Address0x41a6028is0bytesinsideablockofsize40free'd
==4832==by0x804846C:test(in/home/yanghao/Desktop/testC/testmem/tmp)
==4832==USEOfuninitialisedvalueofsize4//非法指针
==4832==at0x804847B:test(in/home/yanghao/Desktop/testC/testmem/tmp)
==4832==Processterminatingwithdefaultactionofsignal11(SIGSEGV)//由于非法指针赋值导致的程序崩溃
==4832==Badpermissionsformappedregionataddress0x419FFF4
==4832==HEAPSUMMARY:
==4832==inuseatexit:0bytesin0blocks
==4832==totalheapusage:1allocs,2frees,40bytesallocated
==4832==Allheapblockswerefreed--noleaksarepossible
==4832==Forcountsofdetectedandsuppressederrors,rerunwith:-v
==4832==Use--track-origins=yestoseewhereuninitialisedvaluescomefrom
==4832==ERRORSUMMARY:4errorsfrom4contexts(suppressed:11from6)
Segmentationfault
从valgrind的检测输出结果看,这几个错误都找了出来。