使用Valgrind工具套件中的Massif监测C++程序堆内存使用

news2024/9/30 3:26:27

Valgrind是一款用于内存调试、内存泄漏检测以及线程问题分析的套件。它由一系列的工具组成,适用于Linux、macOS等操作系统。下面简要介绍几个主要的Valgrind工具:

  1. Memcheck 这是Valgrind最常用的工具,用于检测程序中的内存错误,包括非法内存读写、使用未初始化的内存等。
  2. Cachegrind 用于检测程序的缓存行为,可以找出影响性能的缓存未命中等问题。
  3. Callgrind 执行程序时会收集调用数据,用于查找程序的代价高昂的部分。
  4. Massif 堆内存使用监视程序,有助于分析程序的内存使用情况。
  5. Helgrind 线程错误检测工具,可以检测出潜在的死锁以及其他线程同步问题。

使用Valgrind非常简单,无需修改被诊断的程序,不过为得到更好的结果,通常编译的时候需要加上-g选项。运行是,只需要在命令行中加上valgrind和工具名,后面跟上要运行的程序和参数即可。Valgrind会运行程序并收集诊断数据,随后生成详细的报告。这些报告对于调试程序、优化性能非常有帮助。当然,Valgrind也会带来一定的性能开销,根据工具的不同,执行会变慢数倍至数十倍。使用这个工具的时候基本上都是在找问题,所以运行慢并不是很大的问题。

Valgrind的网址:Valgrind HomeOfficial Home Page for valgrind, a suite of tools for debugging and profiling. Automatically detect memory management and threading bugs, and perform detailed profiling. The current stable version is valgrind-3.23.0.icon-default.png?t=N7T8https://valgrind.org/

我们使用其中的Massif来观察一下程序运行过程中堆内存的使用。

一段简单的程序如下:

#include <iostream>

using namespace std;

class myVector
{
private:
    double *ele;
    int size;
public:
    myVector(int sz);
    ~myVector();

    double& operator[](int i)
    {
        if (i < 0 || i >= size)
        {
            throw "Index out of range";
        }
        return ele[i];
    }

    double operator[](int i) const
    {
        if (i < 0 || i >= size)
        {
            throw "Index out of range";
        }
        return ele[i];
    }

    int getSize() const
    {
        return size;
    }
};

myVector::myVector(int sz) : size(sz)
{
    ele = new double[size];
    for (int i = 0; i < size; i++)
    {
        ele[i] = 0;
    }
}

myVector::~myVector()
{
    delete[] ele;
}

int main()
{
    myVector v(2048);
    v[0] = 1.0;
    v[1] = 2.0;
    v[2] = 3.0;
    v[3] = 4.0;
    v[4] = 5.0;

    for (int i = 0; i < 5; i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;

    myVector v2(2048);
    cout << v2.getSize() << endl;

    return 0;
}

编译:  g++ -o test_mem -g -O0 test_mem.cpp 

运行程序:valgrind --tool=massif ./test_mem

会在目录下生成massif.out.xxxx (xxxx是进程号),这个就是报告文件。

使用ms_print massif.out.xxxx 命令可以显示报告的内容,例如下面显示了一部分:

显示了heap内存使用量和时间的关系,由于我们的程序太小了,大部分时间都花在了一开始的程序装载上,因此所有的内存使用都挤在最后一点。

手册中关于这个现象的解释和解决方法:

Why is most of the graph empty, with only a couple of bars at the very end? By default, Massif uses "instructions executed" as the unit of time. For very short-run programs such as the example, most of the executed instructions involve the loading and dynamic linking of the program. The execution of main (and thus the heap allocations) only occur at the very end. For a short-running program like this, we can use the --time-unit=B option to specify that we want the time unit to instead be the number of bytes allocated/deallocated on the heap and stack(s).

按照说明重新执行程序: valgrind --tool=massif --time-unit=B ./test_mem,再使用ms_print显示如下:

可以看到堆内存使用有了明显的变化。

接下来search了一下ubuntu的软件包,发现一个好用的工具,

sudo apt install massif-visualizer 安装上,然后用这个工具分别打开上面两次运行的记录文件:

这是第一次的,这么看果然清晰多了!

下面这个是第二次的,因为横轴,纵轴都是相同的单位(内存用量),所以看着是这种比较奇怪的图形。其实如果用这个工具的话,反而是上面按时间轴的记录更好理解一些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1662566.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【动态规划】子数组、子串系列II|等差数列划分|最长湍流子数组|单词拆分|环绕字符串中唯一的子字符串

一、等差数列划分 413. 等差数列划分 算法原理 &#x1f4a1;细节&#xff1a; 1.如果当前nums数组中i位置的数和前面两个数可以构成等差数列&#xff0c;那么当前位置所有子数组构成的等差数列个数dp[i]就等于前一个位置有子数组构成的等差数列个数1&#xff08;这个1代表增加…

基于MWORKS 2024a的MIMO-OFDM 无线通信系统设计

一、引言 在终端设备和数据流量爆发式增长的今天&#xff0c;如何提升通信系统容量、能量效率和频谱利用率成为5G通信的关键问题之一。大规模天线阵列作为5G及B5G无线通信关键技术通过把原有发送端天线数量提升一个或多个数量级&#xff0c;实现波束聚集、控制波束转向&#x…

钒回收树脂五氧化二钒净化回收工艺

钒是一种重要的工业金属&#xff0c;广泛应用于钢铁合金、化工、航空和电池材料等领域。随着资源的日益紧张和环保要求的提高&#xff0c;回收利用钒成为了一个重要的研究方向。树脂吸附技术是一种常用的从废水或废料中回收钒的方法&#xff0c;具有操作简便、效率高、成本相对…

OpenCV中的模块:点云配准

点云配准是点云相关的经典应用之一。配准的目的是估计两个点云之间位姿关系从而完成两者对应点之间的对齐/对应,因而在英文中又叫“align”、“correspondence”。笔者曾经是基于OpenCV进行三维重建的,并且从事过基于深度学习的6DoF位置估计等工作。在这些工作中,除了重建点…

Ansible的安装与配置

Ansible的安装与配置 1. 安装ansible # ansible是epel源提供的&#xff0c;所以必须安装epel&#xff1a; [rootRocky9 ~]# yum -y install epel-release Last metadata expiration check: 0:01:53 ago on Tue 26 Dec 2023 10:05:34 PM CST. Dependencies resolved. Package …

如何在 CentOS 上安装并配置 Redis

如何在 CentOS 上安装并配置 Redis 但是太阳&#xff0c;他每时每刻都是夕阳也都是旭日。当他熄灭着走下山去收尽苍凉残照之际&#xff0c;正是他在另一面燃烧着爬上山巅散烈烈朝晖之时。 ——史铁生 环境准备 本教程将在 CentOS 7 或 CentOS 8 上进行。确保你的系统已更新到最…

Java入门基础学习笔记7——Intellij IDEA开发工具概述、安装

之前的开发工具存在一些问题&#xff1a; 文本编辑工具&#xff1a;记事本、NotePad、EditPlus、Sublime...编写代码的时候没有错误提醒、没有智能代码提示、需要自己进行编译、执行、功能不够强大。 集成开发环境&#xff08;IDE&#xff1a;Integrated Development Environm…

Python 3 中zip()函数的用法

1 创作灵感 我们在阅读代码的时候&#xff0c;经常会看到zip函数&#xff0c;有的时候还和循环在一起用&#xff0c;今天举几个例子测试一下该函数的用法 2.应用举例 &#xff08;1&#xff09;定义了两个列表一个是num,一个是letter (2)使用zip可以把num列表和letter列表中…

k8s遇到的常见问题及解决

1. error: open /var/lib/kubelet/config.yaml: no such file or directory 解决&#xff1a;关键文件缺失&#xff0c;多发生于没有做 kubeadm init就运行了systemctl start kubelet。 要先成功运行kubeadm init 2. 执行初始化kubeadm init ------的时候报错 The HTTP call…

视频批量剪辑高效掌握,轻松驾驭视频制作,播放速度与帧数尽在掌控

在追求速度与激情的视频制作世界里&#xff0c;你是否曾渴望拥有一款能够轻松调整播放速度和秒数的神器&#xff1f;现在&#xff0c;这款神器已经来到了你的身边&#xff0c;让你在视频制作的道路上更加得心应手&#xff0c;效率倍增&#xff01; 首先&#xff0c;我们要进入媒…

机器学习-L1正则/L2正则

机器学习-L1正则/L2正则 目录 1.L1正则 2.L2正则 3.结合 1.L1正则 L1正则是一种用来约束模型参数的技术&#xff0c;常用于机器学习和统计建模中&#xff0c;特别是在处理特征选择问题时非常有用。 想象一下&#xff0c;你在装备行囊准备去旅行&#xff0c;但你的行囊有一…

如何用python的Turtle绘画?

目录 一、画一个圆和正方形 二、简单的方式来画一个美女 三、Turtle是一个用于绘制图形的标准库 一、画一个圆和正方形 import turtle# 创建一个图形窗口 window turtle.Screen() window.bgcolor("white")# 创建一个海龟画笔 pen turtle.Turtle() pen.shape(&q…

Maven 插件使用

1.spring-boot-maven-plugin 我们直接使用 maven package &#xff08;maven自带的package打包功能&#xff09;&#xff0c;打包Jar包的时候&#xff0c;不会将该项目所依赖的Jar包一起打进去&#xff0c;在使用java -jar命令启动项目时会报错&#xff0c;项目无法正常启动。…

使用Flask-Admin创建强大的后台管理系统

文章目录 安装Flask-Admin创建Flask应用添加Flask-Admin添加模型扩展延伸自定义视图权限管理文件上传 结语 在Web应用开发中&#xff0c;后台管理系统是至关重要的组成部分&#xff0c;它能够让管理员轻松管理应用的各种数据和配置。Flask-Admin是一个功能强大的Flask扩展&…

2024-05-10 C语言使用开源的JPEG解码库libjpeg 读取JPEG文件并将其解码为RGB24格式的数据

一、可以使用开源的JPEG解码库&#xff0c;例如libjpeg库&#xff0c;来读取JPEG文件并将其解码为RGB24格式的数据。 二、在ubuntu上面进行测试。 2.1安装了libjpeg-dev包 sudo apt-get install libjpeg-dev 2.2 测试c源码 #include <stdio.h> #include <stdlib.h&…

ssrf(第二弹)

四&#xff0c;post请求 1.打开环境&#xff0c;提示说发一个HTTP POST请求&#xff0c;ssrf是用php的curl实现的.并且会跟踪302跳转。 2.用dirsearch扫一下常见的端口&#xff0c;看到有三个可以访问的页面 3.构造伪协议&#xff0c;因为要通过172.0.0.1访问&#xff0c;我们…

在centos7中运行向量数据库PostgreSQL连接不上如何排查?

1. 检查 PostgreSQL 服务状态 首先&#xff0c;您需要确认 PostgreSQL 服务是否正在运行。您可以使用以下命令来检查服务状态&#xff1a; sudo systemctl status postgresql如果服务没有运行&#xff0c;您需要启动它&#xff1a; sudo systemctl start postgresql2. 确认 …

activiti 工作流基本使用

Activiti 介绍 Activiti 是一个开源架构的工作流引擎&#xff0c;基于bpmn2.0 标准进行流程定义。其前身是JBPM&#xff0c;Activiti 通过嵌入到业务系统开发中进行使用。 官方是这样介绍 activiti的&#xff1a; Activiti 是领先的轻量级、以 Java 为中心的开源 BPMN 引擎&…

【百家稷学】大语言模型核心算法原理与综合实践(北京信息科技大学实训)...

继续咱们百家稷学专题&#xff0c;本次是有三AI在北京信息科技大学进行的培训。百家稷学专题的目标&#xff0c;是走进100所高校和企业进行学习与分享。 分享主题 本次分享是在北京信息科技大学&#xff0c;面向全校学生报名&#xff0c;主题是《大语言模型核心算法原理与综合实…

HaDoop Hive

目录 1.VMware 的配置 2.JDK的部署 3.防火墙&#xff0c;SElinux&#xff0c;时间同步设置 4.云平台 5.阿里云 6.UCloud 7.Hadoop理论 7.1 Hadoop理论 7.2 VMware Hadoop实践 7.3集群部署常见问题解决 7.4 云服务器上 Hadoop实践 7.5 HDFS 的 shell 7.6…