【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进行下载编译的,所以这部分是参考了如下博客,其他也是有参考的。

经验分享 程序员 微信小程序 职场和发展