Linux环境下内存泄露检测

13 篇文章 1 订阅

linux下内存泄漏检测工具valgrind

该工具可以检测下列与内存相关的问题 :

  • 未释放内存的使用
  • 对释放后内存的读/写
  • 对已分配内存块尾部的读/写
  • 内存泄露
  • 不匹配的使用malloc/new/new[] 和 free/delete/delete[]
  • 重复释放内存

  • Memcheck。这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。这也是本文将重点介绍的部分。

  • Callgrind。它主要用来检查程序中函数调用过程中出现的问题。

  • Cachegrind。它主要用来检查程序中缓存使用出现的问题。

  • Helgrind。它主要用来检查多线程程序中出现的竞争问题。

  • Massif。它主要用来检查程序中堆栈使用中出现的问题。

  • Extension。可以利用core提供的功能,自己编写特定的内存调试工具

valgrind安装

有2种办法

1.使用命令行安装

sudo apt-get install valgrind  #安装 

 具体apt-get 命令参考https://blog.csdn.net/baidu_16370559/article/details/128531236?csdn_share_tail=%7B"type"%3A"blog"%2C"rType"%3A"article"%2C"rId"%3A"128531236"%2C"source"%3A"baidu_16370559"%7D

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;
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值