Valgrind是一个用于检查程序内存泄漏、段错误等bug的工具。它包含的有:内存检测、缓存检测、代码覆盖、性能测试等功能,主要在X86和PPC的Linux工作。
1.检查内存错误:
例如我们原来有一个程序sec_infod,这是一个用gcc –g参数编译的程序,运行它需要:
#./a.out
如果我们想用valgrind的内存检测工具,我们就要用如下方法调用:
#valgrind --leak-check=full --show-reachable=yes --trace-children= yes ./a.out (2>logfile加上会好些,程序在执行期间stderr会有一些输出。提示比较多)
其中--leak-check=full 指的是完全检查内存泄漏,--show-reachable=yes是显示内存泄漏的地点,--trace-children=yes是跟入子进程。
如果您的程序是会正常退出的程序,那么当程序退出的时候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
3.Valgrind使用参数
--log-fd=N 默认情况下,输出信息是到标准错误stderr,也可以通过—log-fd=8,输出到描述符为8的文件
--log-file=filename将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID。可以通过--log- file exactly=filename指定就输出到filename文件。
--log-file-qualifier=<VAR>,取得环境变量的值来做为输出信息的文件名。如—log-file- qualifier=$FILENAME。
--log-socket=IP:PORT 也可以把输出信息发送到网络中指定的IP:PORT去
--error-limit=no 对错误报告的个数据进行限制,默认情况不做限制
--tool=<toolname> [default: memcheck]
--tool=memcheck:要求用memcheck这个工具对程序进行分析
--leak-ckeck=yes 要求对leak给出详细信息
--trace-children=<yes|no> [default: no]跟踪到子进程里去,默认请况不跟踪
--xml=<yes|no> [default: no]将信息以xml格式输出,只有memcheck可用
--gen-suppressions=<yes|no|all> [default: no]如果为yes,valgrind会在每发现一个错误便停下让用户做选择是继续还是退出
更多选项请参看: http://www.valgrind.org/docs/manual/manual-core.html可以把一些默认选项编辑在 ~/.valgrindrc文件里。
这里使用valgrind的memcheck和callgrind两个工具的用法,其实valgrind还有几个工具:“cachegrind”,用于检查缓存使用的;“helgrind”用于检测多线程竞争资源的,等等。