您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 其它行业文档 > valgrind的使用方法-详细手册
valgrind的使用Valgrind是一个GPL的软件,用于Linux(Forx86,amd64andppc32)程序的内存调试和代码剖析。你可以在它的环境中运行你的程序来监视内存的使用情况,比如C语言中的malloc和free或者C++中的new和delete。使用Valgrind的工具包,你可以自动的检测许多内存管理和线程的bug,避免花费太多的时间在bug寻找上,使得你的程序更加稳固。Valgrind的主要功能Valgrind工具包包含多个工具,如Memcheck,Cachegrind,Helgrind,Callgrind,Massif。下面分别介绍个工具的作用:Memcheck工具主要检查下面的程序错误:使用未初始化的内存(Useofuninitialisedmemory)使用已经释放了的内存(Reading/writingmemoryafterithasbeenfree’d)使用超过malloc分配的内存空间(Reading/writingofftheendofmalloc’dblocks)对堆栈的非法访问(Reading/writinginappropriateareasonthestack)申请的空间是否有释放(Memoryleaks–wherepointerstomalloc’dblocksarelostforever)malloc/free/new/delete申请和释放内存的匹配(Mismatcheduseofmalloc/new/new[]vsfree/delete/delete[])src和dst的重叠(Overlappingsrcanddstpointersinmemcpy()andrelatedfunctions)CallgrindCallgrind收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache模拟。在运行结束时,它会把分析数据写入一个文件。callgrind_annotate可以把这个文件的内容转化成可读的形式。Cachegrind它模拟CPU中的一级缓存I1,D1和L2二级缓存,能够精确地指出程序中cache的丢失和命中。如果需要,它还能够为我们提供cache丢失次数,内存引用次数,以及每行代码,每个函数,每个模块,整个程序产生的指令数。这对优化程序有很大的帮助。Helgrind它主要用来检查多线程程序中出现的竞争问题。Helgrind寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导致难以发掘的错误。Helgrind实现了名为”Eraser”的竞争检测算法,并做了进一步改进,减少了报告错误的次数。Massif堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。Valgrind安装1、到、解压安装包:tar–jxvfvalgrind-3.2.3.tar.bz23、解压后生成目录valgrind-3.2.34、cdvalgrind-3.2.35、./configure6、Make;makeinstallValgrind使用用法:valgrind[options]prog-and-args[options]:常用选项,适用于所有Valgrind工具1.-tool=name最常用的选项。运行valgrind中名为toolname的工具。默认memcheck。2.h–help显示帮助信息。3.-version显示valgrind内核的版本,每个工具都有各自的版本。4.q–quiet安静地运行,只打印错误信息。5.v–verbose更详细的信息,增加错误数统计。6.-trace-children=no|yes跟踪子线程?[no]7.-track-fds=no|yes跟踪打开的文件描述?[no]8.-time-stamp=no|yes增加时间戳到LOG信息?[no]9.-log-fd=number输出LOG到描述符文件[2=stderr]10.-log-file=file将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID11.-log-file-exactly=file输出LOG信息到file12.-log-file-qualifier=VAR取得环境变量的值来做为输出信息的文件名。[none]13.-log-socket=ipaddr:port输出LOG到socket,ipaddr:portLOG信息输出1.-xml=yes将信息以xml格式输出,只有memcheck可用2.-num-callers=numbershownumbercallersinstacktraces[12]3.-error-limit=no|yes如果太多错误,则停止显示新错误?[yes]4.-error-exitcode=number如果发现错误则返回错误代码[0=disable]5.-db-attach=no|yes当出现错误,valgrind会自动启动调试器gdb。[no]6.-db-command=command启动调试器的命令行选项[gdb-nw%f%p]适用于Memcheck工具的相关选项:1.-leak-check=no|summary|full要求对leak给出详细信息?[summary]2.-leak-resolution=low|med|highhowmuchbtmerginginleakcheck[low]3.-show-reachable=no|yesshowreachableblocksinleakcheck?[no]Valgrind使用举例下面是一段有问题的C程序代码test.c#includestdlib.hvoidf(void){int*x=malloc(10*sizeof(int));x[10]=0;//问题1:数组下标越界}//问题2:内存没有释放intmain(void){f();return0;}1、编译程序test.cgcc-Walltest.c-g-otest2、使用Valgrind检查程序BUGvalgrind--tool=memcheck--leak-check=full./test3、分析输出的调试信息==3908==Memcheck,amemoryerrordetector.==3908==Copyright(C)2002-2007,andGNUGPL'd,byJulianSewardetal.==3908==UsingLibVEXrev1732,alibraryfordynamicbinarytranslation.==3908==Copyright(C)2004-2007,andGNUGPL'd,byOpenWorksLLP.==3908==Usingvalgrind-3.2.3,adynamicbinaryinstrumentationframework.==3908==Copyright(C)2000-2007,andGNUGPL'd,byJulianSewardetal.==3908==Formoredetails,rerunwith:-v==3908==--3908--DWARF2CFIreader:unhandledCFIinstruction0:50--3908--DWARF2CFIreader:unhandledCFIinstruction0:50/*数组越界错误*/==3908==Invalidwriteofsize4==3908==at0x8048384:f(test.c:6)==3908==by0x80483AC:main(test.c:11)==3908==Address0x400C050is0bytesafterablockofsize40alloc'd==3908==at0x40046F2:malloc(vg_replace_malloc.c:149)==3908==by0x8048377:f(test.c:5)==3908==by0x80483AC:main(test.c:11)==3908====3908==ERRORSUMMARY:1errorsfrom1contexts(suppressed:14from1)==3908==malloc/free:inuseatexit:40bytesin1blocks.==3908==malloc/free:1allocs,0frees,40bytesallocated.==3908==Forcountsofdetectederrors,rerunwith:-v==3908==searchingforpointersto1not-freedblocks.==3908==checked59,124bytes.==3908====3908==/*有内存空间没有释放*/==3908==40bytesin1blocksaredefinitelylostinlossrecord1of1==3908==at0x40046F2:malloc(vg_replace_malloc.c:149)==3908==by0x8048377:f(test.c:5)==3908==by0x80483AC:main(test.c:11)==3908====3908==LEAKSUMMARY:==3908==definitelylost:40bytesin1blocks.==3908==possiblylost:0bytesin0blocks.==3908==stillreachable:0bytesin0blocks.==3908==suppressed:0bytesin0blocks.
本文标题:valgrind的使用方法-详细手册
链接地址:https://www.777doc.com/doc-6072593 .html