Valgrind是一款在Linux下的程序内存调试工具,它支持x86、x86_64和ppc32,能对编译后的二进制程序进行内存使用监测,监测C语言里的malloc和free,还有C++里的new和delete,进而找出内存泄漏问题。
包含在Valgrind里的Memcheck工具,能够检查如下的程序错误。
运用未经过初始化处理的内存,(Use of uninitialised memory)
运用超出通过malloc所进行分配的内存空间范围,(读取/写入超出malloc分配块的末尾)
针对于堆栈,存在着那种不恰当区域的读取亦或是写入这种方式的非法访问 ,(Reading/writing inappropriate areas on the stack)。
用以申请的空间,是不是存在着被释放的情况呢,(内存泄漏——即指向通过malloc分配的内存块的指针永远丢失的情况)
用于申请内存的malloc、new, 与用于释放内存的 free、delete、delete之间,存在着申请和释放内存的匹配问题,也就是存在如Mismatched use of malloc/new/new vs free/delete/delete这样的情况。
关于在内存复制函数以及相关函数中,源指针和目标指针的重叠情况,也就是重叠的源指针和目标指针在内存复制有关函数里,这样的情况。
重复free
1、编译安装 Valgrind:
wget http://valgrind.org/downloads/valgrind-3.4.1.tar.bz2
拆解开压缩文件,使用tar命令,解压valgrind - 3.4.1.tar.bz2文件。
cd valgrind-3.4.1/
使用“./configure”,指定“--prefix”为“/usr/local/webserver/valgrind”。
make
make install
2、把对于“ls”程序进程的检查进行操作,在返回所得的结果里,其中的“definitely lost: 0 bytes in 0 blocks.”这一表述乃是意味着不存在内存泄漏的情况。
root@xoyo42 /
运行位于 /usr/local/webserver/valgrind/bin/ 路径下的 valgrind 工具,使其以 memcheck 模式进行检查操作,并且将泄漏检查级别设置为全面检查,在此模式下执行列出根目录下文件列表的 ls 命令,最后输出结果。
==1157== Memcheck,是一个用于检测内存错误的工具。
==1157== 版权所有(C)2002年至2008年,并且遵循GNU通用公共许可证,作者为朱利安·西沃德等人。
==1157== 版权所有(C)2004年至2008年,并且遵循GNU通用公共许可证,由OpenWorks LLP所有。
以下是改写后的:==1157==,在2000年至2008年期间,由朱利安·苏厄德等人创作,并且遵循GNU通用公共许可证。
在具体情况方面,若你想获取更多详细信息,可通过再次运行时添加参数:-v来达成这一目的。
==1157==
bin,data0,dev,home,lib64,media,mnt,opt,root,selinux,sys,tcsql对数据库索引主键进行解密,ttsever形成进程识别号,var。
将“boot”,“data1”,“etc”,“lib”,“lost+found”,“misc”,“net”,“proc”,“sbin”,“srv”,“tcsql.db”,“tmp”,“usr”这些内容,以一种特殊的排列方式呈现出来,并且它们在系统中各自有着独特的作用和属性。
==1157==
==1157==错误总览情况是,不存在来自于零个上下文环境背景的零个错误,(被抑制的错误状态为):五个错误源自于一个上下文环境背景。
等于1157,动态内存分配/释放情况是,程序退出时仍在使用,的是28471字节,存在于36个内存块中。
==1157== 内存分配/释放情况为,有166次分配操作,130次释放操作,总共分配了51,377字节。
正在搜寻指向,36个,未释放的,块的指针。在搜索指向,36个,未被释放的,块的指针。
==1157==
==1157== LEAK SUMMARY:
确定丢失:总字节数为0,这些字节分布在分块数量为0的块中。确切地说丢失了:0个字节,分布于0个块之中。

该指令的意思是:在1157这个标识下,可能丢失:零个字节,存在于零个块中。
到了1157这个数值时,仍然存在可触及的情况,具体是28471个字节,它们分布在36个数据块当中。
被抑制的情况是这样的呀,有零个块,其中字节数为零,具体数值是1157等于等于,并且是这样的一种状况呢。
要看到它们,重新运行时使用:--leak-check=full,--show-reachable=yes。
3、检查一个运用libevent库撰写的“httptest”程序进程,返回结果里的“definitely lost: 255 bytes in 5 blocks.”意味着内存泄漏发生。
root@xoyo42 tcsql-0.1
在路径 /usr/local/webserver/valgrind/bin 下,运行 valgrind 程序,使用 memcheck 工具开展检查,采取全量泄漏检查方式,运行 ./httptest这个程序。
Memcheck,是一款用于检测内存错误的工具,它的编号是1274 ,有这样的标识 ==1274==。
它的版权归属于2002年到2008年期间,由朱利安·苏厄德等人依据GNU通用公共许可证所拥有,是这样的情况。
==1274== 用到了LibVEX,它是一个版本为rev 1884的,用于动态二进制翻译的库。
==1274== 版权所有(C)2004年至2008年,并且遵循GNU GPL协议规定,由OpenWorks有限责任合伙公司持有。
在2000年至2008年期间,由朱利安·西沃德等人创作并遵循GNU通用公共许可证发布,版权归其所有。
==1274== 要是想获取更多详细信息的话,那就重新运行并带上:-v 这样操作呀。
==1274==
==1274== 错误总结情况是,0个错误源自0个上下文环境,(被抑制的情况是)在2个上下文环境中有1005个错误。
等于一千二百七十四等于,内存分配/释放情况为,程序退出时仍在使用的,共有四百零二万二千九百一十字节,分布于七十四个内存块。
那啥,等于1274呀,这里存在着这样的情况,malloc/free呢,有15,939次分配,还有15,865次释放,并且分配了6,281,523字节。
==1274== 要是想知晓所检测到的错误的数量,那就重新运行并带上:-v。
检验了,682,468,160个字节哟==1274==。
==1274==
在0x4A05FBB处,发生了malloc行为,此行为来自vg_replace_malloc.c文件的207行。
由0x3C1D809BC6导致此情况,具体是evhttp_decode_uri,位置在http.c文件的2105行 ,==1274==。
通过0x401C75,在/data0/tcsql/cankao/tcsql-0.1/tcsql中的tcsql_handler,出现了==1274==。
等于1274,由地址为0x3C1D80C88F引发:当执行evhttp_get_body函数时,在http.c文件的1582行处出现相关情况。
等价于1274,由0x3C1D8065F7完成:事件基础循环,呈现于事件.c文件的392行处。
==1274== ,由0x403E2F导致:主函数(存在于/data0/tcsql/cankao/tcsql-0.1/tcsql中)。
==1274==
==1274== LEAK SUMMARY:
在1274这个编号下,明确无疑地丢失了,255个字节,分布于5个块内。
恰为一千二百七十四,极有可能有所遗失,为零字节于零个数据块之中。
等于1274,处于仍可触及的状态当中,有402036个字节,分布于69个块里。
在1274这个编号下,被抑制的情况出现了,具体是零字节零块这样状态、情况、表现。
要看到它们,使用:--leak-check=full --show-reachable=yes 重新运行。
检测httptest程序,找出有一处“char *decode_uri = evhttp_decode_uri(evhttp_request_uri(req));”里的“decode_uri”未被free,在程序处理完毕后加上“ free(decode_uri);”,之后运用Valgrind检查,结果已然是“definitely lost: 0 bytes in 0 blocks.”。