linux下内存泄漏检测工具valgrind
该工具可以检测下列与内存相关的问题 :
- 未释放内存的使用
- 对释放后内存的读/写
- 对已分配内存块尾部的读/写
- 内存泄露
- 不匹配的使用malloc/new/new[] 和 free/delete/delete[]
- 重复释放内存
-
Memcheck。这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。这也是本文将重点介绍的部分。
-
Callgrind。它主要用来检查程序中函数调用过程中出现的问题。
-
Cachegrind。它主要用来检查程序中缓存使用出现的问题。
-
Helgrind。它主要用来检查多线程程序中出现的竞争问题。
-
Massif。它主要用来检查程序中堆栈使用中出现的问题。
-
Extension。可以利用core提供的功能,自己编写特定的内存调试工具
valgrind安装
有2种办法
1.使用命令行安装
sudo apt-get install valgrind #安装
2.源代码下载安装
tar -jxvf valgrind-3.17.0.tar.bz2.tar.bz2
cd valgrind-3.17.0
sudo ./configure #配置
sudo make //编译安装
sudo make install
在银河麒麟服务器v10系统上,使用的是默认的配置。这样各个模块会被安装在/usr/local下
/usr/local/bin valgrind相关可执行程序
/usr/local/include/valgrind
/usr/local/lib/valgrind
/usr/local/libexec/valgrind
安装后好会出现:valgrind: failed to start tool 'memcheck' for platform 'amd64-linux': No such file or directory
解决办法:
1.在vim ~/.bashrc
中添加:
export VALGRIND_LIB=/usr/local/libexec/valgrind
2.退出vim,然后执行source ~/.bashrc
即可
3.执行valgrind --version
可以查看到valgrind版本即成功!
源码解压编译安装具体步骤见:linux 源码包解压编译安装_小飞侠hello的博客-CSDN博客
看版本,查看是否安装成功
valgrind --version
Valgrind使用方法
用法: valgrind [options] prog-and-args [options]:
最通用的用法:
valgrind --tool=memcheck --leak-check=full ./test.exe
常用选项,适用于所有Valgrind工具:
-tool= 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。
h –help 显示帮助信息。
-version 显示valgrind内核的版本,每个工具都有各自的版本。
q –quiet 安静地运行,只打印错误信息。
v –verbose 更详细的信息, 增加错误数统计。
-trace-children=no|yes 跟踪子线程? [no]
-track-fds=no|yes 跟踪打开的文件描述符?[no]
-time-stamp=no|yes 增加时间戳到LOG信息? [no]
-log-fd= 输出LOG到描述符文件 [2=stderr]
-log-file= 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID
-log-file-exactly= 输出LOG信息到 file
-log-file-qualifier= 取得环境变量的值来做为输出信息的文件名。 [none]
-log-socket=ipaddr:port 输出LOG到socket ,ipaddr:port
LOG信息输出
xml=yes 将信息以xml格式输出,只有memcheck可用
-num-callers= show callers in stack traces [12]
-error-limit=no|yes 如果太多错误,则停止显示新错误? [yes]
-error-exitcode= 如果发现错误则返回错误代码 [0=disable]
-db-attach=no|yes 当出现错误,valgrind会自动启动调试器gdb。[no]
-db-command= 启动调试器的命令行选项[gdb -nw %f %p]
适用于Memcheck工具的相关选项:
-leak-check=no|summary|full 要求对leak给出详细信息? [summary]
-leak-resolution=low|med|high how much bt merging in leak check [low]
-show-reachable=no|yes show reachable blocks in leak check? [no]
举例:
//test.cpp 文件
#include<stdlib.h>
void k(void)
{
int *x = (int*)malloc(8 * sizeof(int));
} //内存未释放
int main(void)
{
k();
return 0;
}
1.编译程序test.cpp
gcc -g test.cpp -o test.exe # -g gdb,-o输出
2.使用Valgrind检查程序BUG
valgrind --tool=memcheck --leak-check=full ./test.exe
#--leak-check=full 所有泄露检查
3.查看运行结果
virtual-machine:~/qt$ g++ -g test.cpp -o test.exe
virtual-machin:~/qt$ valgrind --tool=memcheck --leak-check=full ./test.exe
==2922== Memcheck, a memory error detector
==2922== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2922== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==2922== Command: ./test.exe
==2922==
==2922==
==2922== HEAP SUMMARY:
==2922== in use at exit: 32 bytes in 1 blocks
==2922== total heap usage: 1 allocs, 0 frees, 32 bytes allocated
==2922==
==2922== 32 bytes in 1 blocks are definitely lost in loss record 1 of 1
==2922== at 0x4C31B0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2922== by 0x10865B: k() (test.cpp:4)
==2922== by 0x10866B: main (test.cpp:9)
==2922==
==2922== LEAK SUMMARY:
==2922== definitely lost: 32 bytes in 1 blocks
==2922== indirectly lost: 0 bytes in 0 blocks
==2922== possibly lost: 0 bytes in 0 blocks
==2922== still reachable: 0 bytes in 0 blocks
==2922== suppressed: 0 bytes in 0 blocks
==2922==
==2922== For counts of detected and suppressed errors, rerun with: -v
==2922== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
Linux下QT内存泄漏检测工具valgrind
QT也可以使用valgrind检测内存泄漏,和上面一样的步骤安装valgrind。
使用办法:
点击Qt creator 中的分析菜单,选中Valgrind Memory Analyzer(内存分析器)即可。Qt creator 会调用valgrind自动分析中。Memcheck会记录内存异常列表,包含报错信息和简单调用栈。
举例
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
int *px = (int*)malloc(8 * sizeof(int));
px[9] = 0; //数组下标越界
int a = 1;
}