首页 > 系统相关 >Linux下使用valgrind分析C++程序的内存泄漏

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

时间:2024-10-25 18:19:39浏览次数:8  
标签:-- valgrind C++ char gdb 内存 Linux main

目录

一.前言

这篇文章介绍一下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
在这里插入图片描述

然后使用valgrind启动main进行分析,命令valgrind ./main
在这里插入图片描述
可以看到valgrind已经识别到了内存泄漏。

使用--leak-check=full选项可以查看详细信息,能够看到导致内存泄漏的代码位置,但是需要编译生成可执行程序main的时候带调试信息,命令valgrind --leak-check=full ./main
在这里插入图片描述

现在有个问题,在上面的示例中是需要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
在这里插入图片描述
可以看到程序正在等待输入,不会退出,也可以直接看到进程号,信息前面的数字就是进程号。

然后我们开启另一个命令窗口,使用gdb调试main程序,命令gdb ./main
在这里插入图片描述

在gdb中进行远程调试,命令target remote | /usr/bin/vgdb --pid=xxx
在这里插入图片描述

在gdb中获取valgrind在当前时刻可以生成的分析结果,命令monitor leak_check full reachable any
在这里插入图片描述
可以看到,这样就可以在程序退出之前就得到valgrind的分析结果了。

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

现在又有个问题,能不能将valgrind分析结果的输出重定向到文件呢,当然是可以的,命令valgrind --log-file="./valgrind.log" --leak-check=full ./main
在这里插入图片描述
这样就可以得到valgrind的分析结果文件了。

标签:--,valgrind,C++,char,gdb,内存,Linux,main
From: https://blog.csdn.net/2401_85919417/article/details/143090499

相关文章

  • C++获取当前时间并格式化为字符串
    代码一#include<iostream>#include<chrono>intmain(){ autonowTime=std::chrono::system_clock::now(); autonowTimeT=std::chrono::system_clock::to_time_t(nowTime); autopNowTm=std::localtime(&nowTimeT); charbuf[128]; std::strfti......
  • linux内核版本是什么
    Linux内核作为Linux操作系统的核心,负责硬件抽象、资源分配和安全控制等多项功能。它是一个快速发展和广泛应用的开源项目。本文将深入探讨Linux内核的起源、历史、版本管理,以及如何查看和升级系统内核版本。通过这篇文章,你将更全面地了解Linux内核,以及它在现代计算环境中所起的关......
  • c++/python/java/go用途介绍
    C++用途:系统编程:操作系统、驱动程序等底层开发。游戏开发:游戏引擎和高性能游戏应用,因其高效的性能和内存管理。嵌入式系统:适合资源受限的设备。科学计算:高性能计算和数值分析。金融系统:高频交易和复杂金融模型。Python用途:数据科学与分析:广泛用于数据处理和可视化......
  • [linux]: job(百度ai)
    [linux]:job(百度ai)  说明:本文由【百度ai】生成,本人整理。    ‌一、Job概述: 在Linux中,job是指通过shell提交的一个任务或命令的执行实例。‌当一个命令通过shell提交执行时,这个命令就被视为一个job。 每个job都有一个唯一的jobID,并且可以处于不同的......
  • linux中,使用python3 实现用硬链接的方式复制复合文件夹
    copy_with_hardlink.pyimportosimportargparsedefcopy_with_hardlinks(src,dst):ifnotos.path.exists(dst):os.makedirs(dst)foriteminos.listdir(src):src_item=os.path.join(src,item)dst_item=os.path.join(d......
  • linux中的ftp服务有什么用
    Linux中的FTP服务是一种重要的网络协议,用于文件传输和共享。本文将深入探讨Linux中的FTP服务的作用,主要包括:1、文件传输功能;2、远程文件访问;3、文件备份和共享。Linux中的FTP服务允许用户在网络上快速、安全地传输文件。无论是将文件上传到服务器还是从服务器下载文件,FTP提供了高......
  • 指南:NOI Linux 2.0 的使用
    0前言本文主要说明NOILinux2.0的基础使用方法,主要测试代码在较为严格的编译环境下能否通过,避免编译错误,适用于主要以Windows为操作系统,辅以NOILinux2.0虚拟机的设备。以NOILinux2.0为操作系统的设备操作相对复杂,且SN现在也没有该种设备,因此只对NOILinux2.0......
  • 职业技能大赛—物联网应用开发赛项(Ubuntun_Linux)精华笔记 (03)
    MySQL中的show各种查看命令介绍//全局变量在MySQL启动的时候由服务器自动将它们初始化为默认值,这些默认值可以通过更改my.ini这个文件来更改。//MySQL中的show各种查看命令介绍是必须了解的Mysql基础操作还请您认真看下去 1.使用show查看showtables或showtablesfrom......
  • 数据结构图的最短路径-弗洛伊德算法(有向图+数据结构课本C++代码一比一转C语言+邻接矩
    弗洛伊德算法有向图代码如下:#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<stdlib.h>#include<limits.h>#defineMaxInt32767#defineMVNum100intPath[MVNum][MVNum];//存放前驱索引的intD[MVNum][MVNum];//存放当前已知的权值//图的邻接......
  • C++矩阵乘法
    题目描述计算两个矩阵的乘法。n×m 阶的矩阵 A 乘以m×k 阶的矩阵 B 得到的矩阵 C 是n×k 阶的,且 C[i][j]=A[i][0]×B[0][j]+A[i][1]×B[1][j]+C[i][j]=A[i][0]×B[0][j]+A[i][1]×B[1][j]+ …… +A[i][m−1]×B[m−1][j](C[i][j]+A[i][m−1]×B[m−1][j](C[i][......