valgrind 内存泄漏检测工具\Linux C,C++
名称:valgrind是一个调试和剖析的程序工具集。
概要用法:
valgrind [[valgrind] [options]] [your-program] [[your-program-options]]
描述:
Valgrind是一个Linux下灵活的调试和剖析可执行工具。它由在软件层提供综合的CPU内核,和一系列调试、剖析的工具组成。架构是模块化的,所以可以在不破坏现有的结构的基础上很容易的创建出新的工具来。例如我们原来有一个程序sec_infod,这是一个用gcc –g参数编译的程序,运行它需要:#./a.out
如果我们想用valgrind的内存检测工具,我们就要用如下方法调用:
valgrind --leak-check=full --show-reachable=yes --trace-children= yes ./aa.out (2>logfile加上会好些,程序在执行期间stderr会有一些输出。提示比较多)不保存日志
--leak-check=full指的是完全检查内存泄漏,
--show-reachable=yes是显示内存泄漏的地点,
--trace-children=yes是跟入子进程。
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --track-origins=yes --log-file=memcheck.log -v ./可执行文件 参数 保存日志
如果您的程序是会正常退出的程序,那么当程序退出的时候valgrind自然会输出内存泄漏的信息。如果您的程序是个守护进程,那么也不要紧,我们 只要在别的终端下杀死memcheck进程(因为valgrind默认使用memcheck工具,就是默认参数—tools=memcheck):
#killall memcheck
这样我们的程序(./a.out)就被kill
2,检查代码覆盖和性能瓶颈:
我们调用valgrind的工具执行程序:
#valgrind --tool=callgrind ./sec_infod
会在当前路径下生成callgrind.out.pid(当前生产的是callgrind.out.19689),如果我们想结束程序,可以:
#killall callgrind
然后我们看一下结果:
#callgrind_annotate --auto=yes callgrind.out.19689 >log
#vim log
输出解读:
内存访问越界:Invalid write of size 4 或者 Invalid read of size 1
踩内存:Source and destination overlap in memcpy
重复释放:Invalid free() / delete / delete[]
非法指针:Use of uninitialised value of size 4
由于非法指针赋值导致的程序崩溃:Process terminating with default action of signal 11 (SIGSEGV)
性能检测(调优)
valgrind --tool=callgrind -v ./可执行文件 参数
输出 callgrind.out.PID 文件
双击打开,如提示需要安装文件则安装
检测泄露的方法:
1、用valgrind检测泄漏的具体位置,然后改正(一般只修改 definitely lost),改正完再用valgrind检测
2、如果还有泄漏,但是分析不出明确原因,长时间跑一下(比如半天,一天等),看看是否有内存持续增加的现象(原因:valgrind有时候有误报)