Linux系统使用valgrind分析C++程序内存资源使用情况
内存占用是我们开发的时候需要重点关注的一个问题,我们可以人工根据代码推理出一个消耗内存较大的函数,也可以推理出大概会消耗多少内存,但是这种方法不仅麻烦,而且得到的只是推理的数据,而不是实际的数据。
我们可以使用工具来分析实际的内存消耗情况,分析较严重的内存消耗点,然后想办法修改。这篇文章我们就来聊一下在Linux系统中怎么使用valgrind分析C++程序内存资源使用情况。当然,在分析内存使用情况之前建议先解决内存泄漏问题,我们之前也介绍过怎么分析内存泄漏。
valgrind是一个工具组,valgrind里的massif工具可以用来分析内存使用情况,帮助识别程序中内存占用高的部分。
我们来看一个示例程序
#include <iostream>
#include <thread>
#include <chrono>
#include <string.h>void FuncA()
{void *p = malloc(1024);memset(p, 'a', 1024); // 填充一些数据,防止内存处于伪分配的状态free(p);
}void FuncB()
{void *p = malloc(1024 * 3);memset(p, 'a', 1024 * 3);free(p);
}void FuncC()
{void *p = malloc(1024 * 6);memset(p, 'a', 1024 * 6);free(p);
}int main()
{FuncA();std::this_thread::sleep_for(std::chrono::milliseconds(10));FuncB();std::this_thread::sleep_for(std::chrono::milliseconds(10));FuncC();std::this_thread::sleep_for(std::chrono::milliseconds(10));return 0;
}
这个程序很简单,所以我们完全可以直接分析出来实际内存使用情况,但是这里我们来看一下怎么用工具分析。
先执行命令g++ -g ./main.cpp -o main将前面这段代码构建成可执行程序。
安装valgrind可以执行命令apt install valgrind直接安装,然后执行命令valgrind --version查看是否已经正常安装。
valgrind安装完成之后我们就可以执行命令valgrind --tool=massif --time-unit=ms ./main启动分析了,解释一下这条命令中的参数:
--tool=massif表示使用massif工具。--time-unit=ms表示按照时间片抓取快照,还可以指定按照程序执行的指令数或者内存的变化量抓取快照。
这条命令执行完成后会生成一个分析结果文件

这个分析结果文件的文件名默认就是上图中的格式,后缀是进程号。
然后我们分析一下这个分析结果文件,valgrind有个自带的工具叫ms_print可以用来打开这种分析结果文件,比如执行命令ms_print ./massif.out.3679就可以查看了。
但是这个可视化效果不好,我们可以使用另外一个工具massif-visualizer来分析,这个工具可以以火焰图的形式将结果文件展示出来。
可以执行命令apt install massif-visualizer安装massif-visualizer工具,然后执行命令massif-visualizer --version确认是否已经正常安装。
安装完成之后我们就可以使用massif-visualizer分析了,比如执行命令massif-visualizer ./main.massif.out打开结果文件,这个工具的具体用法可以自己研究下

上面这种方法只能在程序执行完之后才能获取到分析结果文件,我们来看一下怎么在程序执行的过程中获取分析结果文件,需要使用gdb配合。
修改一下代码
#include <iostream>
#include <thread>
#include <chrono>
#include <string.h>void FuncA()
{void *p = malloc(1024);memset(p, 'a', 1024); // 填充一些数据,防止内存处于伪分配的状态free(p);
}void FuncB()
{void *p = malloc(1024 * 3);memset(p, 'a', 1024 * 3);free(p);
}void FuncC()
{void *p = malloc(1024 * 6);memset(p, 'a', 1024 * 6);free(p);
}int main()
{FuncA();std::this_thread::sleep_for(std::chrono::milliseconds(10));FuncB();std::this_thread::sleep_for(std::chrono::milliseconds(10));FuncC();std::this_thread::sleep_for(std::chrono::milliseconds(10));getchar();return 0;
}
可以看到只是多了一个getchar(),用这种方式来让程序不要直接退出。执行命令g++ -g ./main.cpp -o main构建一下。
执行命令valgrind --vgdb=yes --tool=massif --time-unit=ms --massif-out-file=main.massif.out ./main启动分析,解释一下这条命令中的参数:
- –vgdb=yes表示开启gdbserver。
- –massif-out-file=main.massif.out表示指定生成的分析结果文件名为main.massif.out。

可以看到程序正在执行,前面那个数字是进程号,等下需要用到。
然后我们另外开启一个命令窗口,执行命令gdb ./main启动gdb调试。

然后在gdb中启动远程调试,比如执行命令target remote | /usr/bin/vgdb --pid=6004,pid就是前面启动分析时的那个。

然后在gdb中执行命令monitor all_snapshot main.massif.vgdb.out,这条命令可以驱动valgrind使用当前所有快照生成一个文件名为main.massif.vgdb.out的分析结果文件,在程序执行完之后也会生成一个分析结果文件。

需要注意的是在gdb中远程调试时进程会阻塞,可以在gdb中使用命令c让程序继续执行,就是gdb正常调试时的指令。
如果这篇文章对你有帮助,别忘了关注我啊,可能我还会写出更多对你有帮助的文章
相关文章:
Linux系统使用valgrind分析C++程序内存资源使用情况
内存占用是我们开发的时候需要重点关注的一个问题,我们可以人工根据代码推理出一个消耗内存较大的函数,也可以推理出大概会消耗多少内存,但是这种方法不仅麻烦,而且得到的只是推理的数据,而不是实际的数据。 我们可以…...
Java基础夯实——2.7 线程上下文切换
线程上下文切换(Thread Context Switching)是操作系统在多线程环境中,切换CPU从执行一个线程的上下文到另一个线程的上下文的过程。这种切换是实现多线程并发执行的核心机制之一。 1 上下文: 线程的上下文指线程在某一时刻的执行状态,如&am…...
死锁相关习题 10道 附详解
2022 设系统中有三种类型的资源(A,B,C)和五个进程(P1,P2,P3,P4,P5),A资源的数量是17,B资源的数量是6,C资源的数量是19。在T0时刻系统的状态: 最大资源需求量已分配资源量A,B,CA,B,…...
VisionPro 机器视觉案例 之 彩色保险丝个数统计
第十四篇 机器视觉案例 之 彩色保险丝颜色识别个数统计 文章目录 第十四篇 机器视觉案例 之 彩色保险丝颜色识别个数统计1.案例要求2.实现思路2.1 方法一 颜色分离工具CogColorSegmenterTool将每一种颜色分离出来,得到对应的单独图像,使用斑点工具CogBlo…...
go-zero(七) RPC服务和ETCD
go-zero 实现 RPC 服务 在实际的开发中,我们是通过RPC来传递数据的,下面我将通过一个简单的示例,说明如何使用go-zero框架和 Protocol Buffers 定义 RPC 服务。 一、生成 RPC项目 在这个教程中,我们根据user.api文件࿰…...
Jenkins + gitee 自动触发项目拉取部署(Webhook配置)
目录 前言 Generic Webhook Trigger 插件 下载插件 编辑 配置WebHook 生成tocken 总结 前言 前文简单介绍了Jenkins环境搭建,本文主要来介绍一下如何使用 WebHook 触发自动拉取构建项目; Generic Webhook Trigger 插件 实现代码推送后,触…...
043 商品详情
文章目录 详情页数据表结构voSkuItemVo.javaSkuItemSaleAttrVo.javaAttrValueAndSkuIdVo.javaSpuAttrGroupVo.javaGroupAttrParamVo.java pom.xmlSkuSaleAttrValueDao.xmlSkuSaleAttrValueDao.javaAttrGroupDao.xmlAttrGroupServiceImpl.javaSkuInfoServiceImpl.javaSkuSaleAtt…...
【人工智能】Python与Scikit-learn的模型选择与调参:用GridSearchCV和RandomizedSearchCV提升模型性能
解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在机器学习建模过程中,模型的表现往往取决于参数的选择与优化。Scikit-learn提供了便捷的工具GridSearchCV和RandomizedSearchCV,帮助我们在参数空间中搜索最佳组合以提升模型表现。本文将从理论和实践两个角度…...
深入探讨 Puppeteer 如何使用 X 和 Y 坐标实现鼠标移动
背景介绍 现代爬虫技术中,模拟人类行为已成为绕过反爬虫系统的关键策略之一。无论是模拟用户点击、滚动,还是鼠标的轨迹移动,都可以为爬虫脚本带来更高的“伪装性”。在众多的自动化工具中,Puppeteer作为一个无头浏览器控制库&am…...
<OS 有关> ubuntu 24 不同版本介绍 安装 Vmware tools
原因 想用 apt-get download 存到本地 / NAS上,减少网络流浪。 看到 VMware 上的确实有 ubuntu,只是版本是16。 ubuntu 版本比较:LTS vs RR LTS: Long-Term Support 长周期支持, 一般每 2 年更新,会更可靠与更稳定…...
C#调用JAVA
参考教程:使用IKVMC转换Jar为dll动态库(含idea打包jar方法)-CSDN博客 已经实践过,好使。...
JavaEE-多线程基础知识
文章目录 前言与回顾创建一个多线程线程的创建以及运行机制简述step1: 继承Thread类step2: 实现Runable接口step3: 基于step1使用匿名内部类step4: 基于step2使用匿名内部类step5: 基于step4使用lambda表达式(推荐) Thread的常见方法关于jconsole监视线程的工具构造方法解析获取…...
Pulid:pure and lightning id customization via contrastive alignment
1.introduction 基于微调的方案,对每个id进行定制需要花费数十分钟。另一项研究则放弃了对每个id进行微调,而是选择在一个庞大的肖像数据集上预训练一个id适配器。这些方法通常利用编码器例如clip来提取id特征,提取的特征随后以特定方式例如嵌入到cross attention集成到基础…...
什么是GraphQL,有什么特点
什么是GraphQL? GraphQL 是一种用于 API(应用程序编程接口)的查询语言,由 Facebook 在 2012 年开发,并于 2015 年开源。它提供了一种更高效、强大的方式来获取和操作数据,与传统的 RESTful API 相比&#…...
Java项目-基于SpringBoot+vue的租房网站设计与实现
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
1.实验目的 熟悉了解掌握SQL Server软件的基本操作与使用方法,以及通过理论课学习与实验参考书的帮助,熟练掌握使用T-SQL语句和交互式方法对数据表进行插入数据、修改数据、删除数据等等的操作;作为后续实验的基础,根据实验要求重…...
【大数据学习 | Spark】RDD的概念与Spark任务的执行流程
1. RDD的设计背景 在实际应用中,存在许多迭代式计算,这些应用场景的共同之处是,不同计算阶段之间会重用中间结果,即一个阶段的输出结果会作为下一个阶段的输入。但是,目前的MapReduce框架都是把中间结果写入到HDFS中&…...
ruoyi框架完成分库分表,按月自动建表功能
前提 这个分库分表功能,按月自动建表,做的比较久了,还没上线,是在ruoyi框架内做的,踩了不少坑,但是已经实现了,就分享一下代码吧 参考 先分享一些参考文章 【若依系列】集成ShardingSphere S…...
Antd中的布局组件
文章目录 一、Layout二、Menu三、Grid栅格 布局组件涉及项目框架的搭建,往往被忽略和低关注,毕竟不是经常用到,但是在调整项目结构的时候往往又需要重新设计布局,所以有必要提前归纳分析; 一、Layout Layout导出Sider,…...
一文详解kafka知识点
目录 1、kafka定义 2、消息队列 2.1、产品选择 2.2、应用场景 2.3、消息队列的两种模式 3、kafka架构 4、kafka生产者 4.1、kafka生产者原理 4.2、kafka生产者异步发送 4.3、同步发送 4.4、分区 4.4.1、kafka分区好处 4.4.2、分区策略 4.4.3、自定义分区 4.5、生成吞…...
大牛直播SDK(SmartMediaKit)Windows平台RTSP/RTMP直播播放SDK集成说明(C#版)
文档概述 本文介绍大牛直播SDK(SmartMediaKit)在 Windows 平台下 RTSP、RTMP 直播播放模块的集成方法,面向 Windows Forms、WPF 等 C# 客户端应用场景,重点说明 SDK 集成准备、播放器初始化、RTSP/RTMP 播放、播放参数配置、事件…...
中兴B863AV3.2-M刷机避坑指南:S905L3A芯片识别、固件选择与Amlogic USB Burning Tool 2.2.0配置详解
中兴B863AV3.2-M刷机全流程精解:从芯片识别到固件烧录的进阶实践 在智能电视盒的玩家圈子里,中兴B863AV3.2-M因其出色的硬件配置和可玩性备受关注。这款搭载Amlogic S905L3A芯片的设备,通过刷机可以解锁更多功能,但过程中暗藏的&q…...
如何告别模组管理噩梦:XXMI启动器的3个革命性解决方案
如何告别模组管理噩梦:XXMI启动器的3个革命性解决方案 【免费下载链接】XXMI-Launcher Modding platform for GI, HSR, WW and ZZZ 项目地址: https://gitcode.com/gh_mirrors/xx/XXMI-Launcher 你是否曾经为管理多个游戏的模组而感到头疼?每个游…...
当“数字孪生”有了坐标、时序和一棵“会落叶的树”:NNU‑Campus‑Geo3DGS 数据集深度解读
地理编码的3D高斯,联结了数字重建与“真实地面”之间的两条坐标轴线假设你是一名城市规划师,面对一座城市的数字孪生模型——楼宇轮廓完整、道路走向清晰、绿化植被葱郁——但无论怎样旋转视角,这座模型都“悬浮”在地理基准面之上࿰…...
Python核心基础
本文摘要:Python核心基础章节系统讲解了编程基础知识,主要包括:1.字面量的概念与写法,强调字符串必须使用引号包裹;2.变量与常量的定义与使用,介绍命名规则和三种命名风格;3.注释的两种形式&…...
限时开放!ElevenLabs未公开东北话语音微调接口文档(含token绕过+方言embedding注入完整POC)
更多请点击: https://codechina.net 第一章:ElevenLabs东北话语音微调接口的发现与边界定义 ElevenLabs 官方 API 文档未显式标注“东北话”支持,但通过其语音克隆(Voice Cloning)与声音微调(Fine-tuning&…...
三星固件下载全攻略:Bifrost跨平台工具的快速上手指南
三星固件下载全攻略:Bifrost跨平台工具的快速上手指南 【免费下载链接】Bifrost Cross-platform tool for downloading Samsung mobile device firmware. 项目地址: https://gitcode.com/gh_mirrors/sa/Bifrost 还在为三星设备刷机找不到官方固件而烦恼吗&am…...
高效解包Godot游戏资源:PCK文件解析与自动化提取实战指南
高效解包Godot游戏资源:PCK文件解析与自动化提取实战指南 【免费下载链接】godot-unpacker godot .pck unpacker 项目地址: https://gitcode.com/gh_mirrors/go/godot-unpacker Godot游戏资源解包是游戏开发者和逆向工程师经常面临的技术挑战。本文将深入介绍…...
GHelper:华硕笔记本性能调优的轻量级革命
GHelper:华硕笔记本性能调优的轻量级革命 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops with nearly the same functionality. Works with ROG Zephyrus, Flow, TUF, Strix, Scar, ProArt, Vivobook, Zenbook, Expertbook, RO…...
【Python range() 函数详解】
文章目录Python range() 函数详解 ✨什么是range()函数? 🤔range()的参数和用法 📊单参数形式:range(stop)双参数形式:range(start, stop)三参数形式:range(start, stop, step)range()对象的特点 …...
