【Linux应用】内存泄漏查看工具---valgrind
本篇博客主要是说明如何使用valgrind。
valgrind的底层模拟了一个核心,即一个软件模拟的CPU,被调试的程序就是运行在这个假核心上,此外还包含一系列调试工具。它的工具运行依赖于底层的核心,由于是模块化架构,工具可单独开发,只要与核心的版本匹配即可。它的默认工具是memcheck,通过--tool=<toolname>来指定运行的工具。
一、下载
(下载慢) (下载较快)
二、编译
-
1.解压安装包
tar -jxvf valgrind-3.11.0.tar.bz2 -C /usr/local/src
-
2.进入目录安装
cd /usr/local/src/valgrind-3.11.0
-
3.运行./autogen.sh 设置环境(需要标准的autoconf工具)
./autogen.sh
-
4.配置Valgrind,生成MakeFile文件
./configure --prefix=/usr/local
-
5.编译和安装valgrind
make && make install
三、使用
1、缺少lib库
找到valgrind的lib库并放到开发板/tmp/lib/valgrind,并使用下面命令指定lib库位置
export VALGRIND_LIB=/tmp/lib/valgrind
2、编译添加-g
首先,在编译程序的时候打开调试模式(gcc编译器的-g选项)。如果没有调试信息,即使最好的valgrind工具也将中能够猜测特定的代码是属于哪一个函数。打开调试选项进行编译后再用valgrind检查,valgrind将会给你的个详细的报告,比如哪一行代码出现了内存泄漏。 当检查的是C++程序的时候,还应该考虑另一个选项 -fno-inline。它使得函数调用链很清晰,这样可以减少你在浏览大型C++程序时的混乱。比如在使用这个选项的时候,用memcheck检查openoffice就很容易。当然,你可能不会做这项工作,但是使用这一选项使得valgrind生成更精确的错误报告和减少混乱。 一些编译优化选项(比如-O2或者更高的优化选项),可能会使得memcheck提交错误的未初始化报告,因此,为了使得valgrind的报告更精确,在编译的时候最好不要使用优化选项。
3、命令行说明
./valgrind --tool=memcheck --trace-children=yes --leak-check=full ./xxxx
--tool=memcheck: 指定使用memcheck工具,也可以用来指定使用其他工具(详情可自行查阅其他工具) --trace-children=<yes|no>: 如果是yes,被调程序若用exec开启了一个子进程,那valgrind将会追踪此子进程的执行情况。默认是no,但无论如何,valgrind都还是追踪fork产生的子进程。 --leak-check=<no|summary|full>: 要求对leak给出详细信息? Leak是指,存在一块没有被引用的内存空间,或没有被释放的内存空间,如summary,只反馈一些总结信息,告诉你有多少个malloc,多少个free 等;如果是full将输出所有的leaks,也就是定位到某一个malloc/free。 [default: summary]
4、最小跑动
命令:./valgrind --tool=memcheck --trace-children=yes --leak-check=full ./xxx
需要库
5、报告说明
参考:
三、总结
1、下载编译 valgrind源码可以下载,通过源码再使用开发板的编译工具链就能编译出valgrind可执行程序和lib库文件 2、使用 将可执行程序和lib库文件放到开发板中去,配置好环境。直接当成ls这种类似的命令运行即可
四、参考
我自己是使用amlogic源码中自己带有的代码,直接通过make valgrind进行下载编译的,所以这部分是参考了如下博客,其他也是有参考的。
