Linux环境下内存泄露检测

news2024/10/1 9:35:19

linux下内存泄漏检测工具valgrind

该工具可以检测下列与内存相关的问题 :

  • 未释放内存的使用
  • 对释放后内存的读/写
  • 对已分配内存块尾部的读/写
  • 内存泄露
  • 不匹配的使用malloc/new/new[] 和 free/delete/delete[]
  • 重复释放内存

  • Memcheck。这是valgrind应用最广泛的工具,一个重量级的内存检查器,能够发现开发中绝大多数内存错误使用情况,比如:使用未初始化的内存,使用已经释放了的内存,内存访问越界等。这也是本文将重点介绍的部分。

  • Callgrind。它主要用来检查程序中函数调用过程中出现的问题。

  • Cachegrind。它主要用来检查程序中缓存使用出现的问题。

  • Helgrind。它主要用来检查多线程程序中出现的竞争问题。

  • Massif。它主要用来检查程序中堆栈使用中出现的问题。

  • Extension。可以利用core提供的功能,自己编写特定的内存调试工具

valgrind安装

有2种办法

1.使用命令行安装

sudo apt-get install valgrind  #安装 

2.源代码下载安装

tar -jxvf valgrind-3.17.0.tar.bz2.tar.bz2
cd valgrind-3.17.0	
sudo ./configure	 #配置
#如果更换其他安装目录,则使用如下命令
#./configure --prefix=/opt/valgrind #配置安装目录
sudo make			//编译安装
sudo make install

看版本,查看是否安装成功

valgrind --version

Valgrind使用方法

用法: valgrind [options] prog-and-args [options]:

最通用的用法:

valgrind --tool=memcheck --leak-check=full ./test.exe

常用选项,适用于所有Valgrind工具:
-tool= 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。
h –help 显示帮助信息。
-version 显示valgrind内核的版本,每个工具都有各自的版本。
q –quiet 安静地运行,只打印错误信息。
v –verbose 更详细的信息, 增加错误数统计。
-trace-children=no|yes 跟踪子线程? [no]
-track-fds=no|yes 跟踪打开的文件描述符?[no]
-time-stamp=no|yes 增加时间戳到LOG信息? [no]
-log-fd= 输出LOG到描述符文件 [2=stderr]
-log-file= 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID
-log-file-exactly= 输出LOG信息到 file
-log-file-qualifier= 取得环境变量的值来做为输出信息的文件名。 [none]
-log-socket=ipaddr:port 输出LOG到socket ,ipaddr:port

LOG信息输出

xml=yes 将信息以xml格式输出,只有memcheck可用
-num-callers= show callers in stack traces [12]
-error-limit=no|yes 如果太多错误,则停止显示新错误? [yes]
-error-exitcode= 如果发现错误则返回错误代码 [0=disable]
-db-attach=no|yes 当出现错误,valgrind会自动启动调试器gdb。[no]
-db-command= 启动调试器的命令行选项[gdb -nw %f %p]
适用于Memcheck工具的相关选项:

-leak-check=no|summary|full 要求对leak给出详细信息? [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]
 

举例:

//test.cpp 文件
#include<stdlib.h>
void k(void)
{
int *x = (int*)malloc(8 * sizeof(int));
} //内存未释放

int main(void)
{
k();
return 0;
}

1.编译程序test.cpp
gcc -g test.cpp  -o test.exe      #  -g gdb,-o输出

2.使用Valgrind检查程序BUG
valgrind --tool=memcheck --leak-check=full ./test.exe
#--leak-check=full 所有泄露检查

3.查看运行结果

virtual-machine:~/qt$ g++ -g  test.cpp -o test.exe
virtual-machin:~/qt$ valgrind --tool=memcheck --leak-check=full ./test.exe
==2922== Memcheck, a memory error detector
==2922== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==2922== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==2922== Command: ./test.exe
==2922== 
==2922== 
==2922== HEAP SUMMARY:
==2922==     in use at exit: 32 bytes in 1 blocks
==2922==   total heap usage: 1 allocs, 0 frees, 32 bytes allocated
==2922== 
==2922== 32 bytes in 1 blocks are definitely lost in loss record 1 of 1
==2922==    at 0x4C31B0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2922==    by 0x10865B: k() (test.cpp:4)
==2922==    by 0x10866B: main (test.cpp:9)
==2922== 
==2922== LEAK SUMMARY:
==2922==    definitely lost: 32 bytes in 1 blocks
==2922==    indirectly lost: 0 bytes in 0 blocks
==2922==      possibly lost: 0 bytes in 0 blocks
==2922==    still reachable: 0 bytes in 0 blocks
==2922==         suppressed: 0 bytes in 0 blocks
==2922== 
==2922== For counts of detected and suppressed errors, rerun with: -v
==2922== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

Linux下QT内存泄漏检测工具valgrind

QT也可以使用valgrind检测内存泄漏,和上面一样的步骤安装valgrind。

使用办法:

点击Qt creator 中的分析菜单,选中Valgrind Memory Analyzer(内存分析器)即可。Qt creator 会调用valgrind自动分析中。Memcheck会记录内存异常列表,包含报错信息和简单调用栈。

举例


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    int *px = (int*)malloc(8 * sizeof(int));
    px[9] = 0; //数组下标越界
    int a = 1;
}

 

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

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

相关文章

vscode插件(个人正在用的)

插件目录any-ruleAuto Close TagAuto Rename Tagbackground-coverChinese (Simplified) (简体中文) Language Pack for Visual Studio CodeDebugger for JavaError LensESLintExtension Pack for JavaImage previewIntelliCodeIntelliCode API Usage ExamplesLanguage Support …

对耳朵伤害最小的耳机类型有哪些,对耳朵伤害小的骨传导耳机

现在耳机的佩戴方式越来越多样化&#xff0c;完美最常见的入耳式耳机&#xff0c;长时间佩戴会导致耳朵肿胀、不适&#xff0c;如果换成骨传导耳机就不会有这个困扰了&#xff0c;骨传导耳机利用开放式听声音的方式&#xff0c;可以在极大程度上减少对听力的损害&#xff0c;从…

Docsify保姆级教程

官网 Docsify官网地址 docsify.js.org/ 前言 动态生成文档网站的一款热门工具&#xff01;网上很多关于动态生成文档的工具&#xff01;今天我们的主角是Docsify&#xff01; Docsify的优点 无需构建&#xff0c;写完文档直接发布容易使用并且轻量智能的全文搜索丰富的 AP…

很好用的Unity编辑器扩展工具 Odin Inspector教程

Odin Inspector是什么&#xff1f; Odin Inspector是Unity的一个插件&#xff0c;让您可以享受拥有强大&#xff0c;自定义和用户友好编辑器的所有工作流程优势&#xff0c;而无需编写任何自定义编辑器代码。 Odin包含许多功能&#xff0c;例如Static Inspector&#xff0c;Pr…

Mybatis框架(一)初识Mybatis之Mybatis简单使用

本文是本人专栏【Java开发后端系列框架】里的文章&#xff0c;文章根据各框架官网与网上资料加上本人工作经验&#xff0c;进行修改总结发布在这个专栏&#xff0c;主要目的是用于自我提升&#xff0c;不用于获取利益。如果系列文章能到帮到您本人将感到荣幸&#xff0c;如果有…

修改配置文件解决matplotlib中文与正负号乱码问题

步骤如下&#xff1a; 1、 找到配置文件matplotlibrc 不管是啥系统&#xff0c;都可以通过以下方式查找matplotlibrc所在的文件夹&#xff08;可以在终端或者编译器中运行以下代码&#xff09; import matplotlib# 查找字体路径 print(matplotlib.matplotlib_fname())结果&am…

策略模式Strategy

1.意图&#xff1a;定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可以相互替换。此模式使得算法可以独立于使用它们的客户而变化。 2.结构 Strategy&#xff08;策略&#xff09;定义所有支持的算法的公共接口。Context使用这个接口来调用某Concre…

小梅哥FPGA时序分析和约束实例演练课程

P1 FPGA基本原理 基本结构 三要素可类比电路板的器件、连线、对外端子 可编程逻辑功能块 触发器用于实现时序逻辑&#xff0c;进位链用于可编程逻辑块间通讯&#xff0c;使用较少。 具体器件的可编程逻辑功能块结构。第5代将四输入查找表升级到六输入查找表 由上面两个图抽象…

Flink系列-3、Flink入门案例

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 大数据系列文章目录 官方网址&#xff1a;https://flink.apache.org/ 学习资料&#xff1a;https://flink-learning.org.cn/ 目录Flink程序模型…

Linux内核中sk_buff结构详解

目录 1.sk_buff结构体 1.1 sk_buff在内核中的结构 1.2 重要的长度len的解析 2. sk_buff数据区 2.1 线性数据区 2.2 非线性数据区 ---------------------------------------------------------------------------------------------------------------------------- 1.s…

内置常量--R

1. R中内置的常量 R中内置的常量有&#xff1a;1. LETTERS&#xff1a; 26个大写英文字母2. letters: 26个小写英文字母3. month.abb: 月份英文前三个字母组成的缩写4. month.name: 月份的英文名字5. pi : 圆周率π

TensorRT介绍及使用

1、简介 TensorRT是一个针对已训练好模型的SDK&#xff0c;通过该SDK能够在NVIDIA的设备上进行高性能的推理。优点如下&#xff1a; 总结下来主要有以下6点&#xff1a; Reduced Precision&#xff1a;将模型量化成INT8或者FP16的数据类型&#xff08;在保证精度不变或略微降…

Linux学习笔记——Linux实用操作(三)

4.10、环境变量 学习目标&#xff1a; 理解环境变量的作用掌握符号$的作用掌握在Linux中配置环境变量 4.10.1、环境变量 1、在讲解which命令的时候&#xff0c;我们知道使用的一系列命令其实本质上就是一个个的可执行程序。 比如&#xff0c;cd命令的本体就是&#xff1a;…

股价狂跌超70%,特斯拉到底怎么了?

​在2022年的尾声&#xff0c;曾在新能源汽车领域盛极一时的特斯拉即将取得上市以来最糟糕的年度表现&#xff0c;直接跌出全球上公司市值前10名。目前特斯拉已连续第7个交易日下跌&#xff0c;截至2022年12月28日&#xff0c;跌超11%&#xff0c;创八个月最大跌幅&#xff0c;…

Leetcode 855. 考场就座

在考场里&#xff0c;一排有 N 个座位&#xff0c;分别编号为 0, 1, 2, ..., N-1 。当学生进入考场后&#xff0c;他必须坐在能够使他与离他最近的人之间的距离达到最大化的座位上。如果有多个这样的座位&#xff0c;他会坐在编号最小的座位上。(另外&#xff0c;如果考场里没有…

「回顾2022,展望2023」- 技术和兴趣,工作和生活,我们都在旅途中

技术 Java&#xff0c;云原生&#xff0c;前端 技术面好像变窄了 远离CI/CD&#xff0c;重新回到起点 2019年毕业&#xff0c;2018年9月份在距离学校(南昌)不远不近的公司实习开始实习&#xff0c;毕业后去过深圳、上海&#xff0c;最后是杭州&#xff0c;到现在&#xff0c;又…

OV7670图像传感器介绍

OV7670图像传感器简介 OV7670是图像传感器&#xff0c;其体积小、工作电压低&#xff0c;能提供单片VGA摄像头和影像处理器的所有功能。通过SCCB 总线控制&#xff0c;可以输出整帧、子采样、取窗口等方式的各种分辨率8位影响数据。该产品VGA图像最高达到30帧/秒。用户可以完全…

西门子PLC串口协议与以太网通信协议对比

西门子plc品牌众多&#xff0c;通信协议的类型就更多了&#xff0c;具体可分为串口协议和以太网通信协议两大类。 串口协议主要有&#xff1a;MODBUS RTU 通信协议&#xff1b;PROFIBUS 通信协议&#xff1b;USS通信协议&#xff1b;PPI通信协议&#xff1b;MPI通信协议&#…

YGG:2022年年终回顾

2022 年&#xff0c;Yield Guild Games&#xff08;YGG&#xff09;扩大并发展了区块链游戏生态系统和开放的元宇宙。在这篇文章中&#xff0c;我们庆祝我们的公会成员、合作伙伴和社区所取得的里程碑式的成就&#xff0c;并期待接下来的发展。 游戏和基础设施合作伙伴的数量不…

推荐 6 个 GitHub 开源项目

本期推荐开源项目目录&#xff1a;1. B 站自动任务工具2. 学习 Solidity3. 高性能异步抖音爬取工具4. Java学习指南5. 中后台管理系统模版6. ChatGPT 中文调教指南01B 站自动任务工具BiliBiliTool 是一个自动化工具&#xff0c;它可以帮助你每天获取经验、每日签到、批量取关等…