运行时诊断工具Valgrind,自动化代码分析的强力帮手
目录
一、Valgrind介绍
Valgrind是用于内存调试、内存泄漏检测以及性能分析的软件开发工具。它可以监视 一个指定程序的活动并通知你在你的代码中可能存在的各种各样的内存管理问题。它类似于老式的 Electric Fence 工具(该工具将标准的内存分配函数替换为自己的函数以提高诊断能力),但被认为更容易使用并且在多个方面都提供了更丰富的功能 ,而且现在大多数主流 Linux 发行版都提供了该工具,所以在你的系统中使用它不需要花费太多时间,你只需安装它的软件包即可。
目前Valgrind支持以下的平台:
- x86/Linux: 达到并包括SSSE3,但不高--没有SSE4,AVX,AVX2。
- AMD64/Linux: 达到并包括AVX2。
- PPC32/Linux,PPC64/Linux,PPC64LE/Linux: 达到并包括Power8.。
- S390X/Linux 的支持。
- ARM/Linux 的支持,从ARMv7。
- ARM64/Linux: 支持ARMv8。
- MIPS32/Linux,MIPS64/Linux 的支持。
- X86/FreeBSD,AMD64/FreeBSD :支持,从FreeBSD11.3。
- X86/Solaris、AMD64/Solaris、X86/illumos、AMD64/illumos :支持,从Solaris11.
- X86/达尔文(10.5至10.13)、AMD64/达尔文(10.5至10.13): 支持。
- ARM/安卓,ARM64(/安卓,MIPS32/安卓,X86/应用 的支持。
Valgrind编译及运行,需要 kernel 3.0 或更新 ,需要 glibc 2.5.X 或更新支持。在Mac OS X编译运行要求 10.9.x 或更新 。Valgrind工具主要用于自动测试中。 通过使用Valgrind对发现和修复内存泄漏以及其他编程错误的过程进行自动化,Valgrind工具适用于C, C++, Java, Perl, Python, assembly code, Fortran, Ada等编译出来程序,但在C和C++,因为程序 写在这些语言往往具有容易犯内存错误!在你的工具 自动部署、融合、系统或回归测试中使用它帮助很大。
二、Valgrind源码编译及安装
Valgrind( Valgrind Home)工具是开源软件(GPL 2),给官网提供了产品介绍(进展、开发商支持)、源码(各种版本、分支、补丁)、文档(快速引导、用户手册、帮助、学术报告)、联系(bug提交、商业支持)。
现在来看看如何安装部署Valgrind工具,进入下载页面(Current Releases:Valgrind: Current Releases),下载源码,本博文时版本是Valgrind 3.20.0。
完成下载后,进入下载所在目录,将valgrind-3.20.0.tar.bz2拷贝到您支持编译的地方,本文采用的是centos7:
1)解压缩:
tar -jxvf valgrind-3.20.0.tar.bz2
2)进入目录,进行安装,其中/opt/valgrind是你想安装的目录:
cd valgrind-3.20.0
3)编译前配置(--prefix指定安装目录):
./configure --prefix=/opt/valgrind
4)编译:
make
5)安装(需要切换到root):
make install
6)配置环境变量,首先打开~/.bashrc
gedit ~/.bashrc
将valgrind安装路径加入path中,本文配置如下:
保持,并使改变生效:
source ~/.bashrc
7)完成安装:valgrind --version
三、Valgrind工具的使用
【1】例如现在要监测程序cppcloud_serv是否由内存泄漏,直接运行:
valgrind --leak-check=yes ./cppcloud_serv
【2】若想把检测结果输入到文件valgrind_report.log中,可以指定输出文件(./cppcloud_serv -i 1 -p 4800为真正的程序运行命令):
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --run-libc-freeres=yes --log-file=./valgrind_report.log ./cppcloud_serv -i 1 -p 4800
如果觉得指令过长麻烦,也可以在待检测程序所在目录建立一个文件,例如valg,将将这段长指令输入保存
然后变更执行权限:chmod 777 valg,就可以运行指令实现检测:./valg
valgrind 工具会将检测信息出入到指定的日志文件(valgrind_report.log)中,查看日志:cat valgrind_report.log
【3】如果只想直接在屏幕打印日志检测信息,也可以将写入上面的指令修改为:
valgrind --tool=memcheck --leak-check=yes --show-reachable=yes --run-libc-freeres=yes ./cppcloud_serv -i 1 -p 4800
保存后运行:./valg,则检测信息直接在屏幕输出
这里只是抛转引玉,更多关于valgrind的详细说明及运用,请阅读官网的引导手册及用户手册。