【C++基础】内存泄漏检测——Valgrind、VLD、RTC

Valgrind

Valgrind安装

(这里我的安装环境是Ubuntu)

  1. 打开终端,确保你的包列表是最新的。运行以下命令来更新包列表:

    sudo apt update

  2. 安装 valgrind。运行以下命令来安装 valgrind

    sudo apt install valgrind

  3. 安装完成后,验证 valgrind 是否成功安装。在终端中运行以下命令来检查 valgrind 的版本信息:

    valgrind --version

    这应该会显示 valgrind 的版本信息,确认安装成功。

测试程序

#include <stdlib.h>
void f(void)
{int* x = malloc(10 * sizeof(int));x[10]=0;  //问题1:数组下标越界//问题2:内存没有释放
}int main(void)
{f();return 0;
}

编译: 

# gcc -o demo demo.o

利用Valgrind检测:

最常用的检测命令:valgrind --tool=memcheck --leak-check=full ./demo

 其中memcheck的常见选项有:   

    设置内存泄漏检查的行为级别:
    --leak-check=no|summary|full 在退出时是否查找内存泄露。默认值为summary
    设置内存泄漏报告解析级别:
   --leak-resolution=low|med|high how much bt merging in leak check [low]
    设置是否报告那些虽然仍然可以访问但未被显式释放的内存块:
    --show-reachable=no|yes show reachable blocks in leak check? [no]

输出结果:

==31749== Memcheck, a memory error detector
==31749== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==31749== Using Valgrind-3.18.1 and LibVEX; rerun with -h for copyright info
==31749== Command: ./demo
==31749== 
==31749== Invalid write of size 4
==31749==    at 0x10916B: f (demo.c:5)
==31749==    by 0x109180: main (demo.c:11)
==31749==  Address 0x4a9a068 is 0 bytes after a block of size 40 alloc'd
==31749==    at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==31749==    by 0x10915E: f (demo.c:4)
==31749==    by 0x109180: main (demo.c:11)
==31749== 
==31749== 
==31749== HEAP SUMMARY:
==31749==     in use at exit: 40 bytes in 1 blocks
==31749==   total heap usage: 1 allocs, 0 frees, 40 bytes allocated
==31749== 
==31749== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
==31749==    at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==31749==    by 0x10915E: f (demo.c:4)
==31749==    by 0x109180: main (demo.c:11)
==31749== 
==31749== LEAK SUMMARY:
==31749==    definitely lost: 40 bytes in 1 blocks

==31749==    indirectly lost: 0 bytes in 0 blocks
==31749==      possibly lost: 0 bytes in 0 blocks
==31749==    still reachable: 0 bytes in 0 blocks
==31749==         suppressed: 0 bytes in 0 blocks
==31749== 
==31749== For lists of detected and suppressed errors, rerun with: -s
==31749== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
 

结果分析

无效写入:

  1. Invalid write of size 4
    这部分告诉你发生了一个大小为 4 字节的无效写入。这通常表示你的程序试图写入一个内存区域,但它没有权限这样做。

  2. at 0x10916B: f (demo.c:5)
    这一行告诉你在程序的 demo.c 文件的第 5 行的函数 f 中发生了无效写入。

  3. by 0x109180: main (demo.c:11)
    这一行告诉你问题是由程序的 demo.c 文件的第 11 行的 main 函数触发的,它调用了函数 f

  4. Address 0x4a9a068 is 0 bytes after a block of size 40 alloc'd:这部分指出了问题的具体位置。它说在地址 0x4a9a068 处进行了无效写入,而这个地址是在一个大小为 40 字节的内存块之后的 0 字节处。这个信息非常重要,因为它告诉你问题的来源是在一个之前通过 malloc 函数分配的内存块之后的部分。

  5. at 0x4848899: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so):这部分告诉你在 malloc 函数内部的某个地方发生了问题。malloc 是分配内存的标准函数,所以这一行的意思是问题出现在分配内存的过程中。

  6. by 0x10915E: f (demo.c:4):这一行告诉你问题是由程序的 demo.c 文件的第 4 行的函数 f 触发的。通常,在 f 函数中发生了 malloc 调用,它试图分配一块内存,但似乎有问题。

  7. by 0x109180: main (demo.c:11):这一行告诉你问题是由程序的 demo.c 文件的第 11 行的 main 函数触发的,它调用了函数 f

 内存泄漏:

  1. HEAP SUMMARY:这一部分提供了有关程序在退出时内存的摘要信息。它告诉我们,程序在退出时仍然使用了 40 字节的堆内存,只进行了一次分配操作,没有释放。

  2. LEAK SUMMARY:这一部分提供了关于内存泄漏的总结信息。在这种情况下,它指出了程序中的一个内存泄漏:40 字节的内存在程序退出时被泄漏了。泄漏信息包括“definitely lost”(确定泄漏)。

综合来看,该程序文件的第 5 行的函数 中发生了一个无效的内存写入,它写入了一个之前分配的内存块之后的 0 字节。

此外,程序还存在一个内存泄漏,40 字节的内存在程序退出时未被释放。

Windows平台下的内存检测方法

1、比较简单的就是根据Visual Studio中的诊断工具,可视化地查看进程内存的情况

2、使用VLD工具,其安装和使用参考:VS 2022 安装vld内存泄漏检测工具_vs2022内存泄漏检测vld-2.5.1-setup_2_你虞姐的博客-CSDN博客

内存检测工具vld安装配置和使用 Visual Leak Detector_哔哩哔哩_bilibili 

3、使用CRT库

头文件 加上 #include <crtdbg.h>

在main函数最后面一行,加上一句_CrtDumpMemoryLeaks()。调试程序,自然关闭程序让其退出,查看输出:

输出这样的格式{453}normal block at 0x02432CA8,868 bytes long

被{}包围的453就是我们需要的内存泄漏定位值,868 bytes long就是说这个地方有868比特内存没有释放。

定位代码位置,在main函数第一行加上_CrtSetBreakAlloc(453);意思就是在申请453这块内存的位置中断。然后调试程序,程序中断了,查看调用堆栈。

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

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

相关文章

如何使ssh操作linux 更安全

对于提高linux的SSH远程操作安全性可从以下几个方面进行增强 禁用ROOT用户&#xff0c;创建其他用户&#xff0c;并使用密钥登陆更改SSH默认端口号&#xff0c;设置一个较长数位的端口号&#xff0c;增加被端口扫描到的难度可对常使用的用户经常执行的命令进行sudo授权&#x…

jenkins联动显示或隐藏参数

1. 添加组件 Active Choices Plug-in 如jenkins无法联网,可在以下两个地址中下载插件,然后放到/home/jenkins/.jenkins/plugin下面重启jenkins即可 Active Choices Active Choices | Jenkins plugin 2. 效果如下: sharding为空时,sharding_info和copy_info不显示 shard…

【LeetCode-简单题】589. N 叉树的前序遍历

文章目录 题目方法一&#xff1a;单循环栈做法方法二&#xff1a;递归 题目 方法一&#xff1a;单循环栈做法 关键在于子节点的入栈顺序&#xff0c;决定了子节点的出栈顺序&#xff0c; 因为是前序遍历 所以压栈顺序先让右边的入栈 依次往左 这样左边的节点会在栈顶 这样下次…

全链路压测:优化系统性能的关键措施

在现代互联网时代&#xff0c;系统的性能稳定性和可靠性对于企业的成功至关重要。全链路压测作为一项关键的测试措施&#xff0c;可以模拟真实的负载情况&#xff0c;全面评估系统在高负载环境下的表现。本文将介绍全链路压测的定义、作用以及在优化系统性能方面的重要性。 一、…

MATLAB打开历史命令窗口并保持

版本&#xff1a;matlab 2021a 方法&#xff1a;菜单栏 主页 - 布局 - 命令历史记录 - 停靠

elasticsearch 索引write.lock报错解决 —— 筑梦之路

ES报错&#xff1a; Caused by: org.apache.lucene.store.LockObtainFailedException: Lock held by another xxx write.lock 这是ES异常关闭导致索引的写锁未释放&#xff0c;索引一直处于red状态 解决方法&#xff1a; 1. 停掉ES服务 2. 找到相应的数据目录&#xff0c…

成都直播基地排名,天府蜂巢直播基地获高知名度直播基地称号

成都直播基地的排名在近年来不断攀升&#xff0c;其中成都天府蜂巢直播产业基地凭借其卓越的表现获得了高知名度的直播基地称号。成都天府蜂巢直播产业基地凭借其卓越的发展成就和优质的服务&#xff0c;力争为西部地区打造了一个独具魅力的直播产业基地。 双方携手 提速发展 …

经典算法:最短点对

软件架构师何志丹 说明 旧文新发&#xff0c;改了错别字&#xff0c;死链等。尽量保持“原汁原味”。 难点 如何测试。我的解决方式是&#xff1a;a,三种解法&#xff0c;看结果是否一致。b,小数据&#xff08;100个点&#xff09;&#xff0c;人工排查。第一种方法&#x…

【无标题】C语言学习笔记5--循环结构和选择结构

5.1 运算符和运算符 5.1.1逻辑运算发 运算符说明结核性举例&&与运算&#xff0c;双目&#xff0c;对应数学中的“且”左结合1&&0、(9>3)&&(b>a与运算&#xff0c;双目&#xff0c;对应数学中的“且”左结合1!非运算&#xff0c;单目&#xff0…

MySQL(6)LOCK和MVCC

一、锁的分类 按照锁的属性&#xff1a;读锁、写锁、共享锁、排它锁、悲观锁、乐观锁 按照锁的范围&#xff1a;表锁、页锁、间隙锁、临键锁、行锁 按照锁的作用&#xff1a;意向锁、意向共享锁、意向排它锁、IS锁、IX锁 二、MySQL为什么要有锁 锁是计算机协调多个进程或线程并…

vue-cli2项目运行时中断解决方案记录

目录 前情提要解决方案1. cmd设置【结论&#xff1a;不得行】2. npm cache verify 清除缓存【结论&#xff1a;不得行】3. 删除node_modules&#xff0c;再重新npm i安装【结论&#xff1a;不得行】4. 安装cross-env和increase-memory-limit【结论&#xff1a;不得行】5. 在sci…

Redis的安装与基本使用

文章目录 Linux 环境下安装Redis下载Redis 安装包解压安装包安装Redis进入redis安装包下编译并且安装到指定目录下 启动redis配置远程访问找到Redis.config文件 Windows 环境下安装Redis说明官方提供方式安装或启用WSL2在WSL&#xff08;Ubuntu&#xff09;上安装Redis启动Redi…

26052-2022 硬质合金管状焊条 思维导图

声明 本文是学习GB-T 26052-2022 硬质合金管状焊条. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本文件规定了硬质合金管状焊条的技术要求、试验方法、检验规则、标志、包装、运输、贮存、随行文 件和订货单内容。 本文件适用于钢件的表…

Hive【Hive(二)DML】

启动 hive 命令行&#xff1a; hive DML 数据操作 1、数据导入 1.1、向表中装载数据&#xff08;load&#xff09; 语法&#xff1a; hive> load data [local] inpath 数据的path [overwrite] into table student [partition (partcol1val1,…)];&#xff08;1&#x…

修炼k8s+flink+hdfs+dlink(一:安装flink)

一&#xff1a;standalone的ha环境部署。 创建目录&#xff0c;上传安装包。 mkdir /opt/app/flink 上传安装包到本目录。 tar -zxvf flink-1.13.6-bin-scala_2.12.tgz配置参数。 在flink-conf.yaml中添加zookeeper配置 jobmanager.rpc.address: node01 high-availability: …

R语言学习笔记

R语言学习笔记 一.准备环境二.认识控制台三.R包四.数据结构1.向量Vector1.1创建向量1.2访问向量中的数据1.3向量的循环补齐 2.矩阵matrix2.1创建矩阵2.2访问矩阵中的数据 3数组Array3.1创建数组3.2访问数组中的数据 4.数据框Dataframe4.1创建数据框4.2访问数据框中的数据 5因子…

函数指针与回调函数

(1) 1分钟学会函数指针与回调函数&#xff08;上&#xff09;_哔哩哔哩_bilibili #include <QCoreApplication> #include <stdio.h>int sum(int x,int y){ return xy; } int difference(int x,int y){ return x-y; } int product(int x,int y){ return x*y; }in…

GitLab多人开发步骤

目录 一、基于develop创建自己的feature分支二、提交代码格式简易版 三、提交到远程仓库四、提交合并请求 一、基于develop创建自己的feature分支 使用git checkout切换到develop分支 git checkout develop 基于develop分支创建feature分支 格式&#xff1a; git checkout -b …

进阶JS-作用域和作用域链

作用域规定了变量能够被访问的“范围”&#xff0c;离开了这个“范围”变量便不能被访问。 作用域分为&#xff1a;局部作用域、全局作用域 局部作用域&#xff08;Local&#xff09; 局部作用域分为函数作用域和块作用域。 函数作用域&#xff1a;在函数内部声明的变量只能…

MYSQL操作命令大全

mysql命令大全 命令说明示例mysql -h ip -P port -u user -p password远程连接mysqlmysql -h192.168.0.201 -P3306 -uroot -p123mysql -u user -p password本地连接mysqlmysql -uroot -p123select * from information_schema.TABLES where TABLE_SCHEMA(select database()) 查…