24.Linux下程序调试分析工具`Valgrind`

Linux下程序调试分析工具Valgrind

文章目录

  • Linux下程序调试分析工具`Valgrind`
    • 1.基本介绍
    • 2.下载编译安装
    • `Valgrind C++`程序内存扫描示例
      • reference


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


1.基本介绍

Valgrind是开源的Linux程序调试工具,可以用来自动检测程序中存在的内存管理,线程同步的问题,帮助开发人员提升代码调试的效率。

Valgrind还可以输出程序的Profile信息,方便开发者定位程序中的性能问题。

Valgrind是开源的Linux程序,开发者可以根据需要自行修改源码后编译。

Valgrind支持主流的Linux系统,包括x86/Linux, AMD64/LinuxPPC32/Linux

Valgrind功能强大,是大型复杂程序调试和系统profile分析的必备工具。

Valgrind适用于各种程序,包括桌面应用,库文件,数据库,游戏,网络浏览器,网络服务器,分布式控制系统,虚拟现实框架,事物服务器,编译器,虚拟机,嵌入式软件等。

Valgrind直接于程序的二进制文件交互,因此支持分析任何语言所编写的程序,不过Valgrind工具主要是面向C/C++程序的,因为C/C++语言需要手动的管理内存,更容易出问题。

Valgrind 100%覆盖用户空间的代码。

Valgrind开发者社区也比较活跃,Valgrind也在不断推出新版本。截至当前,Valgrind的最新版本是20231031发布的valgrind-3.22.0

2.下载编译安装

Valgrind官方没有发布二进制文件,需要开发者自己下载源码在对应的平台上编译。

  • 1)下载源码

一种方式是下载*.tar.bz2源码压缩包

https://valgrind.org/downloads/current.html

解压:

tar -jxvf valgrind 3.22.0.tar.bz2

另一种方式是使用git下载

git clone https://sourceware.org/git/valgrind.git

下载后编译安装:

cd valgrind
./autogen.sh
./configure --prefix=[installation_dir]
make
make install

Valgrind C++程序内存扫描示例

示例C++程序:

// memory_leak.cpp
struct Foo {int *p_ = nullptr;Foo() {p_ = new int[10];}
};int main(int argc, char **argv)
{Foo foo;return 0;
}

以上非常简单的一段代码,在类Foo的构造函数中使用new操作符在堆上分配了内存,而在使用结束后并没有使用delete操作符释放。

使用g++-g参数保留调试符号。

g++ memory_leak.cpp -g -o leak

使用gdb调试上面代码,发现可以正确执行:

gdb leak -tui
start
b 12
next
c

使用valgrind扫描这段代码生成的可执行文件leak,发现存在内存泄漏:

valgrind --leak-check=yes ./leak

输出为:

# ==291190== Memcheck, a memory error detector
# ==291190== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
# ==291190== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info
# ==291190== Command: ./leak
# ==291190== 
# ==291190== 
# ==291190== HEAP SUMMARY:
# ==291190==     in use at exit: 40 bytes in 1 blocks
# ==291190==   total heap usage: 2 allocs, 1 frees, 73,768 bytes allocated
# ==291190== 
# ==291190== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
# ==291190==    at 0x483E617: operator new[](unsigned long) (vg_replace_malloc.c:725)
# ==291190==    by 0x401168: Foo::Foo() (valgrind.cpp:4)
# ==291190==    by 0x401140: main (valgrind.cpp:11)
# ==291190== 
# ==291190== LEAK SUMMARY:
# ==291190==    definitely lost: 40 bytes in 1 blocks
# ==291190==    indirectly lost: 0 bytes in 0 blocks
# ==291190==      possibly lost: 0 bytes in 0 blocks
# ==291190==    still reachable: 0 bytes in 0 blocks
# ==291190==         suppressed: 0 bytes in 0 blocks
# ==291190== 
# ==291190== For lists of detected and suppressed errors, rerun with: -s
# ==291190== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

上面的报告中,292153是进程ID

在堆上分配了两块内存,Foo foonew int[10],但是只释放了一块,40个字节的new int数组所占的内存并没有释放。因此,程序结束后发生了内存泄漏。

# ==291190== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
# ==291190==    at 0x483E617: operator new[](unsigned long) (vg_replace_malloc.c:725)
# ==291190==    by 0x401168: Foo::Foo() (valgrind.cpp:4)
# ==291190==    by 0x401140: main (valgrind.cpp:11)

上面的堆栈信息告诉我们程序是在哪里发生了内存泄漏。其中:

  • definitely lost意味着内存泄漏,必须修复。
  • probably lost程序可能发生了内存泄漏,除非开发者明确知道自己对指针的操作,否则应该修复。

修复上面问题最简单的就是在析构函数中添加delete操作

// memory_leak.cpp
struct Foo {int *p_ = nullptr;Foo() {p_ = new int[10];}~Foo() {delete[] p_;}
};int main(int argc, char **argv)
{Foo foo;return 0;
}

重新编译后,Valgrind的扫描结果为:

# ==292153== Memcheck, a memory error detector
# ==292153== Copyright (C) 2002-2022, and GNU GPL'd, by Julian Seward et al.
# ==292153== Using Valgrind-3.22.0 and LibVEX; rerun with -h for copyright info
# ==292153== Command: ./leak
# ==292153== 
# ==292153== 
# ==292153== HEAP SUMMARY:
# ==292153==     in use at exit: 0 bytes in 0 blocks
# ==292153==   total heap usage: 2 allocs, 2 frees, 73,768 bytes allocated
# ==292153== 
# ==292153== All heap blocks were freed -- no leaks are possible
# ==292153== 
# ==292153== For lists of detected and suppressed errors, rerun with: -s
# ==292153== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

更多使用方法可以参考https://valgrind.org/docs/manual/manual-intro.html


欢迎访问个人网络日志🌹🌹知行空间🌹🌹


reference

1.https://valgrind.org/docs/manual/manual-intro.html

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

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

相关文章

Openstack(T)openstack event list 验证panko,显示为空

部署完panko,通过执行openstack event list 显示为空 表示没有获取到事件数据 排错思路: 1.保障ceilometer panko服务都是正常的 2.保障ceilometer 到 panko 的数据传输,是正确配置从采集点到存储点的 下面展示配置详情,执行openstack event list 事…

ROS中不同情况下配置文件的编写

配置文件 话题中自定义msg1. 编写msg2. 编辑package.xml3. 编辑CMakeLists.txt4. 编译5. 使用5. 在其他功能包中调用msg5.1 编辑package.xml5.2 编辑CMakeLists.txt 服务中自定义srv1. 编写srv2. 其他 调用头文件1. 编写头文件2. (可选,为了编程时有代码提示)3. 编写…

opencv+python(二值化图像)

1、全局二值化:将图像全部变成两种值,比如:0,255 threshold(src: ndarray(图像,最好是灰度图) thresh: float,(阙值) maxval: float,&…

function 包装器 ——C++新特性(二)

文章目录 包装器function包装器可以包装可调用对象其他使用示例 🎖 博主的CSDN主页:Ryan.Alaskan Malamute 📜 博主的代码仓库主页 [ Gitee ]:ryanala [GitHub]: Ryan-Ala 包装器 function 使用 function包装器…

身份证二、三、四要素实名认证接口、C#开发示例

在瞬息万变的网络时空,每一次点击,每一份交易都离不开对“你是谁”的确认。想象一下,当我们畅游在网络的海洋中,无论是注册心仪已久的APP还是在线办理重要的业务,甚至是在虚拟世界中结交新朋友等活动时,只需…

Selenium+Chrome Driver 爬取搜狐页面信息

进行selenium包和chromedriver驱动的安装 安装selenium包 在命令行或者anaconda prompt 中输入 pip install Selenium 安装 chromedriver 先查看chrome浏览器的版本 这里是 123.0.6312.106 版 然后在http://npm.taobao.org/mirrors/chromedriver/或者https://googlechrom…

EasyPOI复杂表格导入

EasyPOI复杂表格导入 多表头数据导入方式一导入表格实体类文件导入代码测试结果 方式二导入表格实体类文件导入代码测试结果 总结 设置表格从哪行读取表格内容 多表头数据导入 方式一 导入的表格样式如下 导入表格实体类 package com.demo.entity;import cn.afterturn.eas…

基于令牌桶算法对高并发接口的优化

业务背景 项目中有一个抽奖接口,此接口需要处理高并发问题以及使用脚本作弊的问题。 本文主要探讨如何最大程度地减少脚本作弊行为对抽奖业务的影响。 设计思路 如何减少脚本作弊行为对抽奖业务的影响 使用令牌桶算法,对频率过高的用户请求进行拦截 …

pdffactory pro 8注册码序列号下载 附教程

PdfFactory Pro可以说是一款行业专业且技术领先的的PDF虚拟打印机软件。其不仅占用系统内存小巧,功能强大,可支持用户无需使用Acrobat来创建Adobe PDF即可以进行PDF组件的创建和打印。同时,现在全新的PdfFactory Pro 8也正式上线来袭&#xf…

(源码+部署+讲解)基于Spring Boot + Vue编程学习平台的设计与实现

前言 💗博主介绍:✌专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2024年Java精品实战案例《100套》 🍅文末获取源码联系🍅 🌟…

Hadoop简介

Hadoop 1、 Hadoop的介绍 Hadoop最早起源于Nutch。Nutch的设计目标是构建一个大型的全网搜索引擎,包括网页抓取、索引、查询等功能,但随着抓取网页数量的增加,遇到了严重的可扩展性问题——如何解决数十亿网页的存储和索引问题。2003年、20…

【数据结构】考研真题攻克与重点知识点剖析 - 第 7 篇:查找

前言 本文基础知识部分来自于b站:分享笔记的好人儿的思维导图与王道考研课程,感谢大佬的开源精神,习题来自老师划的重点以及考研真题。此前我尝试了完全使用Python或是结合大语言模型对考研真题进行数据清洗与可视化分析,本人技术…

开源铱塔切换MySQL数据库启动报异常

1.错误日志: 铱塔切换数据库配置为MySQL之后,启动后报错如下: SqlExceptionHelper - Table iotkit.task_info doesnt exist SqlExceptionHelper - Table iotkit.rule_info doesnt exist SqlExceptionHelper - Table iotkit.device_info does…

(WSI分类)WSI分类文献小综述 2024

2024的WSI分类。 Multiple Instance Learning Framework with Masked Hard Instance Mining for Whole Slide Image Classification (ICCV2024) 由于阳性组织只占 Gi- gapixel WSI 的一小部分,因此现有的 MIL 方法直观上侧重于通过注意力机…

Redis的常见命令

单线程:每个命令具备原子性 低延迟,速度快(基于内存、IO多路复用、良好的编码) 支持数据持久化 支持主从集群、分片集群 支持多语言客户端 2.Redis数据库介绍 Redis是一个key-value的数据库,key一般是String类型…

(源码+部署+讲解)基于Spring Boot + Vue的车位租赁系统设计与实现

前言 💗博主介绍:✌专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2024年Java精品实战案例《100套》 🍅文末获取源码联系🍅 🌟…

Apache Incubator Answer 本地开发部署

文章目录 简介Github文档插件部署 Answer开发环境编译项目初始化项目运行项目 简介 一款适合任何团队的问答平台软件。 Apache Incubator Answer是一个开源项目,它是一个用于构建和部署问答系统的框架。该项目是Apache软件基金会的孵化器项目,提供一个…

Nginx流媒体服务器RTMP直播同步录像

目录 一、环境 1、以下见往期文章 2、ffmpeg支持 二、建立录像路径

vscode 关键字记录

vscode 关键字记录: ${workspaceFolder}:当前工作区(Workspace)的根目录路径。${file}:当前打开文件的路径。如a/b/c/test.cpp。${fileDirname}:当前打开文件的目录路径。比如文件 test.cpp 位于 a/b/c&am…

自动驾驶中的传感器融合算法

目录 引言 一、传感器融合算法步骤 二、卡尔曼滤波 (Kalman Filter) 1. 卡尔曼滤波的原理 1.1. 预测步骤(Predict) 1.2. 更新步骤(Update) 2. 卡尔曼滤波在自动驾驶中的应用 2.1. 位置和姿态估计 2.2. 目标跟踪和感知 2…