Linux下使用valgrind分析C++程序的内存泄漏

这篇具有很好参考价值的文章主要介绍了Linux下使用valgrind分析C++程序的内存泄漏。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


一.前言

这篇文章介绍一下Linux系统中如何使用valgrind分析C++程序的内存泄漏。

二.下载安装

下载地址:官网。

或者直接使用命令apt install valgrind安装。

三.使用valgrind分析内存泄漏

先看代码

//main.cpp

#include<malloc.h>

void Func(void)
{
	char* p = (char*)malloc(1024);
}

int main(int argc, char* argv[])
{
	Func();

	char* p = (char*)malloc(1024);
	free(p);

	return 0;
}

我们可以看到在Func()函数中存在内存泄漏的问题。

编译生成一个带调试信息的可执行程序main,命令g++ -g ./main.cpp -o main
Linux下使用valgrind分析C++程序的内存泄漏,开发工具,C++,c++,内存泄漏

然后使用valgrind启动main进行分析,命令valgrind ./main
Linux下使用valgrind分析C++程序的内存泄漏,开发工具,C++,c++,内存泄漏

可以看到valgrind已经识别到了内存泄漏。

使用--leak-check=full选项可以查看详细信息,能够看到导致内存泄漏的代码位置,但是需要编译生成可执行程序main的时候带调试信息,命令valgrind --leak-check=full ./main
Linux下使用valgrind分析C++程序的内存泄漏,开发工具,C++,c++,内存泄漏

现在有个问题,在上面的示例中是需要main程序退出之后才能得到valgrind的分析结果,但是我们知道,一般常驻在内存中的服务程序是不会随便退出的,那我们能不能在程序退出之前就得到valgrind的分析结果呢,当然是可以的。

修改代码

//main.cpp

#include<malloc.h>
#include<stdio.h>

void Func(void)
{
	char* p = (char*)malloc(1024);
}

int main(int argc, char* argv[])
{
	Func();

	char* p = (char*)malloc(1024);
	free(p);

	getchar();

	return 0;
}

可以看到在代码中使用getchar()让程序先不要退出,同样使用命令g++ -g ./main.cpp -o main编译生成main程序,然后使用gdb和valgrind配合的方式来进行调试,因为valgrind内置了gdbserver,所以gdb可以远程调试valgrind启动的程序,具体原理这里不展开了。

启动valgrind的时候可以使用--vgdb=yes选项来开启gdbserver,命令valgrind --vgdb=yes --leak-check=full ./main
Linux下使用valgrind分析C++程序的内存泄漏,开发工具,C++,c++,内存泄漏

可以看到程序正在等待输入,不会退出,也可以直接看到进程号,信息前面的数字就是进程号。

然后我们开启另一个命令窗口,使用gdb调试main程序,命令gdb ./main
Linux下使用valgrind分析C++程序的内存泄漏,开发工具,C++,c++,内存泄漏

在gdb中进行远程调试,命令target remote | /usr/bin/vgdb --pid=xxx
Linux下使用valgrind分析C++程序的内存泄漏,开发工具,C++,c++,内存泄漏

在gdb中获取valgrind在当前时刻可以生成的分析结果,命令monitor leak_check full reachable any
Linux下使用valgrind分析C++程序的内存泄漏,开发工具,C++,c++,内存泄漏

可以看到,这样就可以在程序退出之前就得到valgrind的分析结果了。

需要注意的是在gdb远程连接到进程的时候,进程会阻塞,在得到valgrind的分析结果之后,可以在gdb中使用命令c让程序继续执行(就是gdb正常调试时的指令)。

现在又有个问题,能不能将valgrind分析结果的输出重定向到文件呢,当然是可以的,命令valgrind --log-file="./valgrind.log" --leak-check=full ./main
Linux下使用valgrind分析C++程序的内存泄漏,开发工具,C++,c++,内存泄漏

这样就可以得到valgrind的分析结果文件了。


欢迎讨论,欢迎指正,欢迎转载。

文章来源地址https://www.toymoban.com/news/detail-815061.html

到了这里,关于Linux下使用valgrind分析C++程序的内存泄漏的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Valgrind内存诊断工具的使用笔记

    Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的神器,能够帮助我们快速定位到程序的内存问题,比如内存泄漏导致的 段错误 (核心已转储) 包含以下工具: Memcheck :检查程序中的内存问题,如泄漏、越界、非法指针等 Callgrind :主要用来检查程序中函数调用过程中

    2024年02月10日
    浏览(34)
  • 使用gcc 工具链开发单片机程序,怎么查看内存映像

    一、概述 1.1 功能 1.2 命令格式 1.3 支持的目标文件 二、基本应用示例 2.1 查看单个对象文件 2.2 查看整个工程的内存映像 三、命令选项描述 3.1 以不同的进制格式显示内存映像 示例:以十六进制格式显示 3.2 不同的输出方式 3.2.1 可选的表示方式与对应的选项 3.2.2 -A (–format=

    2024年01月19日
    浏览(49)
  • C++内存泄漏检测工具

    在程序中增加相应的内存检测工具  #define CRTDBG MAP ALLOC #include stdlib.h #include crtdbg.h #ifdef DEBUG #ifndef DBGNEW #define DBG_NEW new (_NORMAL_BLOCK,_FILE_LINE_) #define new DBG NEW #endif #endif _CrtDumpMemoryLeaks(); 当没有释放内存时候: 增加了delete时候:  

    2024年01月25日
    浏览(85)
  • ThreadLocal引发的内存泄漏分析

    Object o = new Object(); 这个o,我们可以称之为对象引用,而new Object()我们可以称之为在内存中产生了一个对象实例。 当写下  o=null 时,只是表示o不再指向堆中object的对象实例,不代表这个对象实例不存在了。 强引用:  就是指在程序代码之中普遍存在的,类似“Object obj=new Ob

    2024年02月09日
    浏览(53)
  • LeakCanary内存泄漏检测框架分析。

    一、什么叫内存泄漏、内存溢出? 内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个10M的Bitmap,但系统分配给APP的连续内存不足10M,就会导致内存溢出。 内存泄漏(memory leak):是指程序在申请内存后,无法释放已申

    2024年02月15日
    浏览(43)
  • faac内存开销较大,为方便嵌入式设备使用进行优化(valgrind使用)

    faac内存开销较大,为方便嵌入式设备使用进行优化,在github上提了issues但是没人理我,所以就搞一份代码自己玩吧。 基于faac_1_30版本,原工程https://github.com/knik0/faac faac内存优化: faac内存开销较大,为方便嵌入式设备使用进行优化,在github上提了issues但是没人理我,所以就搞

    2024年02月14日
    浏览(45)
  • C++ map clear内存泄漏问题

    map自带的clear()函数会清空map里存储的所有内容,但如果map值存储的是指针,则里面的值不会被清空,会造成内存泄漏,所以值为指针的map必须用迭代器清空。 使用erase迭代删除 迭代器删除值为指针的map,一定要注意迭代器使用正确,一旦迭代器失效程序就会崩溃。 调用cle

    2024年02月09日
    浏览(34)
  • Android 内存泄漏、性能分析常用工具

    一、内存泄漏 1、 MAT-eclipse :“Memory Analyzer Tool”,一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。 2、Leakcanary :一款开源的自动检测内存泄漏的工具。 3、AndroidStudio Profiler :Android Studio 3.0 采用全新

    2024年02月12日
    浏览(48)
  • eclipse memory Analyzer(MAT) 内存泄漏分析

      1.1软件下载         Eclipse IDE,它非常有用。因为Memory Analyzer在分析堆内存的时候比较耗费内存,而Eclipse IDE本身又是比较耗费内存的,所以推荐使用独立安装的Memory Analyzer。 安装包地址:https://www.eclipse.org/mat/downloads.php 独立安装的Memory Analyzer的独立版本所需的最低Ja

    2024年02月14日
    浏览(50)
  • 【Android】一个contentResolver引起的内存泄漏问题分析

    长时间的压力测试后,系统发生了重启,报错log如下 JNI ERROR (app bug): global reference table overflow (max=51200) global reference table overflow的log 08-08 04:11:53.052912   973  3243 F zygote64: indirect_reference_table.cc:256] JNI ERROR (app bug): global reference table overflow (max=51200) 08-08 04:11:53.053014   973  3243 F z

    2024年02月08日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包