4、内存泄漏检测(多线程)
4、内存泄漏多线程
多线程下使用Valgrind 工具的memcheck检查.
安装
sudo apt install valgrind
使用
valgrind --tool=memcheck --leak-check=full ./app_main
指令效果如下所示.
wq@wq-Virtual-Machine:~/work/test_zlog/build$ valgrind --tool=memcheck --leak-check=full ./app_main
==89377== Memcheck, a memory error detector
==89377== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==89377== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==89377== Command: ./app_main
==89377==
==89377==
==89377== HEAP SUMMARY:
==89377== in use at exit: 1,512 bytes in 2 blocks
==89377== total heap usage: 7 allocs, 5 frees, 2,440 bytes allocated
==89377==
==89377== 512 bytes in 1 blocks are definitely lost in loss record 1 of 2
==89377== at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==89377== by 0x48F7228: mtrace (mtrace.c:326)
==89377== by 0x4011E5: main (main.c:13)
==89377==
==89377== 1,000 bytes in 1 blocks are definitely lost in loss record 2 of 2
==89377== at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==89377== by 0x401209: main (main.c:19)
==89377==
==89377== LEAK SUMMARY:
==89377== definitely lost: 1,512 bytes in 2 blocks
==89377== indirectly lost: 0 bytes in 0 blocks
==89377== possibly lost: 0 bytes in 0 blocks
==89377== still reachable: 0 bytes in 0 blocks
==89377== suppressed: 0 bytes in 0 blocks
==89377==
==89377== For lists of detected and suppressed errors, rerun with: -s
==89377== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --log-file=out.txt ./app_main
该指令详细说明见下文,该指令输出内容会被保存到与可执行文件统计目录下的out.txt文件中.
命令详解
通用命令
basic user options for all Valgrind tools, with defaults in [ ]:-h --help show this message--help-debug show this message, plus debugging options--version show version-q --quiet run silently; only print error msgs-v --verbose be more verbose -- show misc extra info--trace-children=no|yes Valgrind-ise child processes (follow execve)? [no]--trace-children-skip=patt1,patt2,... specifies a list of executablesthat --trace-children=yes should not trace into--trace-children-skip-by-arg=patt1,patt2,... same as --trace-children-skip=but check the argv[] entries for children, ratherthan the exe name, to make a follow/no-follow decision--child-silent-after-fork=no|yes omit child output between fork & exec? [no]--vgdb=no|yes|full activate gdbserver? [yes]full is slower but provides precise watchpoint/step--vgdb-error=<number> invoke gdbserver after <number> errors [999999999]to get started quickly, use --vgdb-error=0and follow the on-screen directions--vgdb-stop-at=event1,event2,... invoke gdbserver for given events [none]where event is one of:startup exit valgrindabexit all none--track-fds=no|yes track open file descriptors? [no]--time-stamp=no|yes add timestamps to log messages? [no]--log-fd=<number> log messages to file descriptor [2=stderr]--log-file=<file> log messages to <file>--log-socket=ipaddr:port log messages to socket ipaddr:portuser options for Memcheck:--leak-check=no|summary|full search for memory leaks at exit? [summary]--leak-resolution=low|med|high differentiation of leak stack traces [high]--show-leak-kinds=kind1,kind2,.. which leak kinds to show?[definite,possible]--errors-for-leak-kinds=kind1,kind2,.. which leak kinds are errors?[definite,possible]where kind is one of:definite indirect possible reachable all none--leak-check-heuristics=heur1,heur2,... which heuristics to use forimproving leak search false positive [all]where heur is one of:stdstring length64 newarray multipleinheritance all none--show-reachable=yes same as --show-leak-kinds=all--show-reachable=no --show-possibly-lost=yessame as --show-leak-kinds=definite,possible--show-reachable=no --show-possibly-lost=nosame as --show-leak-kinds=definite--xtree-leak=no|yes output leak result in xtree format? [no]--xtree-leak-file=<file> xtree leak report file [xtleak.kcg.%p]--undef-value-errors=no|yes check for undefined value errors [yes]--track-origins=no|yes show origins of undefined values? [no]--partial-loads-ok=no|yes too hard to explain here; see manual [yes]--expensive-definedness-checks=no|auto|yesUse extra-precise definedness tracking [auto]--freelist-vol=<number> volume of freed blocks queue [20000000]--freelist-big-blocks=<number> releases first blocks with size>= [1000000]--workaround-gcc296-bugs=no|yes self explanatory [no]. Deprecated.Use --ignore-range-below-sp instead.--ignore-ranges=0xPP-0xQQ[,0xRR-0xSS] assume given addresses are OK--ignore-range-below-sp=<number>-<number> do not report errors foraccesses at the given offsets below SP--malloc-fill=<hexnumber> fill malloc'd areas with given value--free-fill=<hexnumber> fill free'd areas with given value--keep-stacktraces=alloc|free|alloc-and-free|alloc-then-free|nonestack trace(s) to keep for malloc'd/free'd areas [alloc-and-free]--show-mismatched-frees=no|yes show frees that don't match the allocator? [yes]
下列命令可跟在valgrind后面.
--tool=memcheck- 使用memcheck工具,有很多工具很选,例如,
Memcheck,Addrcheck,Cachegrind,等等。
- 使用memcheck工具,有很多工具很选,例如,
--leak-check=full- 要求对leak给出详细信息
--log-file=output.txt- 将分析信息输出值
output.txt文件
- 将分析信息输出值
--show-leak-kinds=all- 显示所有类型的内存泄漏,包括
"definitely lost"、"indirectly lost"、"possibly lost"和"still reachable"。
- 显示所有类型的内存泄漏,包括
输出详解
valgrind输出结果会报告5种内存泄露.
-
"definitely lost":确认丢失。程序中存在内存泄露,应尽快修复。当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法访问这块内存则会报这个错误。 -
"indirectly lost":间接丢失。当使用了含有指针成员的类或结构时可能会报这个错误。这类错误无需直接修复,他们总是与"definitely lost"一起出现,只要修复"definitely lost"即可。- 这表示没有间接丢失的内存。间接丢失的内存是指,由于直接丢失的内存块包含了指向这些内存的指针,因此这些内存也被视为丢失。
-
"possibly lost":可能丢失。大多数情况下应视为与"definitely lost"一样需要尽快修复,除非你的程序让一个指针指向一块动态分配的内存(但不是这块内存起始地址),然后通过运算得到这块内存起始地址,再释放它。例子可参考我的例程。当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法访问这块内存的起始地址,但可以访问其中的某一部分数据,则会报这个错误。
`"still reachable"`:可以访问,未丢失但也未释放。如果程序是正常结束的,那么它可能不会造成程序崩溃,但长时间运行有可能耗尽系统资源,因此笔者建议修复它。如果程序是崩溃(如访问非法的地址而崩溃)而非正常结束的,则应当暂时忽略它,先修复导致程序崩溃的错误,然后重新检测。
"suppressed":已被解决。出现了内存泄露但系统自动处理了。可以无视这类错误。
附录1 tool初步认识
- Memcheck是一个内存错误检测器。它有助于使你的程序,尤其是那些用C和C++写的程序,更加准确。
- Cachegrind是一个缓存和分支预测分析器。它有助于使你的程序运行更快。
- Callgrind是一个调用图缓存生成分析器。它与Cachegrind的功能有重叠,但也收集Cachegrind不收集的一些信息。
- Helgrind是一个线程错误检测器。它有助于使你的多线程程序更加准确。
- DRD也是一个线程错误检测器。它和Helgrind相似,但使用不同的分析技术,所以可能找到不同的问题。
- Massif是一个堆分析器。它有助于使你的程序使用更少的内存。
- DHAT是另一种不同的堆分析器。它有助于理解块的生命期、块的使用和布局的低效等问题。
- SGcheck是一个实验工具,用来检测堆和全局数组的溢出。它的功能和Memcheck互补:SGcheck找到Memcheck无法找到的问题,反之亦然。
- BBV是个实验性质的SimPoint基本块矢量生成器。它对于进行计算机架构的研究和开发很有用处。
附录2 参考
- 【C/C++ 集成内存调试、内存泄漏检测和性能分析的工具 Valgrind 】Linux 下 Valgrind 工具的全面使用指南 - 知乎 (zhihu.com)
- Linux下利用Valgrind工具进行内存泄露检测和性能分析_Linux教程_Linux公社-Linux系统门户网站 (linuxidc.com)
- Valgrind简单用法 - SunBo - 博客园 (cnblogs.com)
相关文章:
4、内存泄漏检测(多线程)
4、内存泄漏多线程 多线程下使用Valgrind 工具的memcheck检查. 安装 sudo apt install valgrind使用 valgrind --toolmemcheck --leak-checkfull ./app_main 指令效果如下所示. wqwq-Virtual-Machine:~/work/test_zlog/build$ valgrind --toolmemcheck --leak-checkfull .…...
在使用tcp长连接时,是否还需要再引入重发机制?
一 什么是tcp长连接? 在TCP(Transmission Control Protocol)中,长连接是指在通信过程中保持连接状态的一种方式,相对于短连接而言。长连接通常用于需要频繁通信的场景,以减少连接建立和断开的开销。在长连接…...
记一次Oracle Cloud计算实例ssh恢复过程
#ssh秘钥丢失# , #Oracle Cloud# 。 电脑上的ssh秘钥文件不知道什么时候丢失了,直到用的时候才发现没有了,这下可好,Oracle Cloud的计算实例连不上了,这个实例只能通过ssh连接上去: 以下是解决步骤&#x…...
2024年01月数据库流行度最新排名
点击查看最新数据库流行度最新排名(每月更新) 2024年01月数据库流行度最新排名 TOP DB顶级数据库索引是通过分析在谷歌上搜索数据库名称的频率来创建的 一个数据库被搜索的次数越多,这个数据库就被认为越受欢迎。这是一个领先指标。原始数…...
Stable Diffusion API入门:简明教程
Stable Diffusion 是一个先进的深度学习模型,用于创造和修改图像。这个模型能够基于文本描述来生成图像,让机器理解和实现用户的创意。使用这项技术的关键在于掌握其 API,通过编程来操控图像生成的过程。 在探索 Stable Diffusion API 的世界…...
数据结构--二叉搜索树的实现
目录 1.二叉搜索树的概念 2.二叉搜索树的操作 二叉搜索树的插入 中序遍历(常用于排序) 二叉搜索树的查找 二叉搜索树的删除 完整二叉树代码: 二叉搜索树的应用 key/value搜索模型整体代码 1.二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一…...
《微信小程序开发从入门到实战》学习六十八
6.6 网络API 6.6.1 网络API 使用wx.request接口可以发起网络请求。该接口接受一个Object参,参数支持属性如下所示: url(必填):开发者服务器地址 data:请求的参数,类型为string/object/ArrayBuffer header…...
阿里是如何去“O”的?
大家好,我是老猫,猫头鹰的“猫”。 今天我们来聊聊数据库这个话题。 2009年,阿里提出“去IOE化”的概念,这在当时看起来是天方夜谭,但目前来看可以说是"轻舟已过万重山"。 IOE是传统IT三大件,…...
蓝桥杯备赛 day 1 —— 递归 、递归、枚举算法(C/C++,零基础,配图)
目录 🌈前言 📁 枚举的概念 📁递归的概念 例题: 1. 递归实现指数型枚举 2. 递归实现排列型枚举 3. 递归实现组合型枚举 📁 递推的概念 例题: 斐波那契数列 📁习题 1. 带分数 2. 反硬币 3. 费解的…...
87 双指针解验证回文字符串II
问题描述:简单给定一个非空字符串s,最多删除一个字符,判断是否成为回文字符串。 双指针解法:指针1指向开头,指针2指向结尾,定义一个count记录不满足回文串的数量,若超过1,则返回fal…...
【排序算法】【二叉树】【滑动窗口】LeetCode220: 存在重复元素 III
作者推荐 【二叉树】【单调双向队列】LeetCode239:滑动窗口最大值 本文涉及的基础知识点 C算法:滑动窗口总结 题目 给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。 找出满足下述条件的下标对 (i, j): i ! j, abs(i - j) < indexDi…...
OS 7--DNS配置+Apache发布网站
环境准备 centOS 7 1.配置DNS 1.1 域名为lianxi.com 1.2 为WWW服务器、FTP服务器、NEWS服务器做域名解析 1)安装DNS yum -y install bind bind-utils (如果安装不上,就把磁盘在重洗挂载一下) 2)修改DNS配置文件 vim /etc/resolv.conf…...
1月2日代码随想录二叉树的最小深度及层序遍历总结
个人认为这么一个层序遍历的章节放这么多基本一样的题目算是很没意思的了 填充每个节点的下一个右侧节点和二叉树最大深度和前面的代码几乎完全一样,所以我就跳过了 代码随想录 (programmercarl.com) 代码随想录 (programmercarl.com) 111.二叉树的最小深度 给…...
RK3568平台开发系列讲解(Linux系统篇)PWM系统编程
🚀返回专栏总目录 文章目录 一、什么是PWM二、PWM相关节点三、PWM应用编程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 PWM 的系统编程。 一、什么是PWM PWM,即脉冲宽度调制(Pulse Width Modulation)...
Linux CPU 数据 Metrics 指标解读
过去从未仔细了解过使用 top 和 htop 等命令时显式的CPU信息,本文我们详解解读和标注一下各个数据项的含义,同时和 Ganglia 显式的数据做一个映射。开始前介绍一个小知识,很多查看CPU的命令行工具都是 cat /proc/stat 里的数据,所…...
Ansible自动化运维(一)简介及部署、清单
👨🎓博主简介 🏅云计算领域优质创作者 🏅华为云开发者社区专家博主 🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 🐋 希望大家多多支…...
深度学习MLP_实战演练使用感知机用于感情识别_keras
目录 (1)why deep learning is game changing?(2)it all started with a neuron(3)Perceptron(4)Perceptron for Binary Classification(5)put it all toget…...
[ffmpeg系列 02] 音视频基本知识
一 视频 RGB: AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB… Y:明亮度, Luminance或luma, 灰阶图, UV:色度,Chrominance或Chroma。 YCbCr: Cb蓝色分量,Cr是红色分量。 取值范围ÿ…...
【ASP.NET Core 基础知识】--目录
介绍 1.1 什么是ASP.NET Core1.2 ASP.NET Core的优势1.3 ASP.NET Core的版本历史 环境设置 2.1 安装和配置.NET Core SDK2.2 使用IDE(Integrated Development Environment):Visual Studio Code / Visual Studio 项目结构 3.1 ASP.NET Core项…...
java数据结构与算法刷题-----LeetCode509. 斐波那契数
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
