valgrind使用浅谈
1、Valgrind 简介
Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具,它可在以下平台上运行: X86/Linux、AMD64/Linux、ARM/Linux、ARM64/Linux、PPC32/Linux、PPC64/Linux、PPC64LE/Linu x、S390X/Linux、MIPS32/Linux、MIPS64/Linux、X86/Solaris , AMD64/Solaris, ARM/Android (2.3.x 及 更 高 版 本 ), ARM64/Android, X86/Android (4.0 及 更 高 版 本 ), MIPS32/Android, X86/FreeBSD, AMD64/FreeBSD, X86/Darwin 和 AMD64/Darwin (Mac OS X 10.12)
2、Valgrind 安装
下载地址:https://valgrind.org/downloads/current.html#current 解压后进入文件夹,执行
./configure --prefix=${install_path}
make -j16
make insatll
3、Valgrind 包含的工具
| Memcheck | 探测程序中内存管理存在的问题。它检查所有对内存的读/写操作,并截取所有的malloc/new/free/delete 调用。因此 memcheck 工具能够探测到以下问题:
|
| cachegrind | cachegrind 是一个 cache 剖析器。它模拟执行 CPU 中的 L1, D1 和 L2 cache,因此它能很精确的指出代码中的 cache 未命中。如果你需要,它可以打印出 cache 未命中的次数,内存引用和发生 cache 未命中的每一行代码,每一个函数,每一个模块和整个程序的摘要。如果你要求更细致的信息,它可以打印出每一行机器码的未命中次 数。在 x86 和 amd64 上,cachegrind 通过 CPUID 自动探测机器的 cache 配置,所以在多数情况下它不再需要更多的配置信息了。 |
| helgrind | 它主要用来检查多线程程序中出现的竞争问题。Helgrind 寻找内存中被多个线程访问,而又没有一贯加锁的区域,这些区域往往是线程之间失去同步的地方,而且会导 致难以发掘的错误。Helgrind 实现了名为”Eraser” 的竞争检测算法,并做了进一步改进,减少了报告错误的次数。 |
| Callgrind | Callgrind 收集程序运行时的一些数据,函数调用关系等信息,还可以有选择地进行cache 模拟。在运行结束时,它会把分析数据写入一个文件。 callgrind_annotate 可以把这个文件的内容转化成可读的形式。 一般用法: valgrind --tool=callgrind ./sec_infod callgrind_annotate --auto=yes callgrind.out.[pid] > log vi log |
| Massif | 堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈 的大小。Massif 能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。 |
| lackey | lackey 是一个示例程序,以其为模版可以创建你自己的工具。在程序结束后,它打印出一些基本的关于程序执行统计数据。 |
4、Valgrind 参数
valgrind [options] prog-and-args [options]
常用选项
| --tool=<name> | 最常用的选项。运行 valgrind 中名为 toolname 的工具。默认memcheck。 |
| -q --quiet | 安静地运行,只打印错误信息。 |
| --verbose | 更详细的信息。 |
| --trace-children=<yes|no> | 跟踪子线程? [default: no] |
| --track-fds=<yes|no> | 跟踪打开的文件描述? [default: no] |
| --time-stamp=<yes|no> | 增加时间戳到 LOG 信息? [default: no] |
| --log-fd=<number> | 输出 LOG 到描述符文件 [2=stderr] |
| --log-file=<file> | 将输出的信息写入到 filename.PID 的文件里,PID 是运行程序的进行 ID |
| --log-file-exactly=<file> | 输出 LOG 信息到 file,LOG 信息输出 |
| --xml=yes | 将信息以 xml 格式输出,只有 memcheck 可用 |
| --db- command=<command> | 启动调试器的命令行选项[gdb -nw %f %p] |
| -leak- check=<no|summary|full> | 要求对 leak 给出详细信息? Leak 是指,存在一块没有被引用的内存空间,或没有被释放的内存空间,如 summary,只反馈一些总结信息,告诉你有多少个 malloc,多少个 free 等;如果是 full 将输出所有的 leaks,也就是定位到某一个 malloc/free,只有 memcheck 可用。 |
| --show- reachable=<yes|no> | 如果为 no,只输出没有引用的内存 leaks,或指向 malloc 返回的内存块中部某处的 leaks [default: no],只有 memcheck 可用。 |
更详细的参数指令见 https://phenix3443.github.io/notebook/software-engineering/debug/valgrind- practices.html#org9b75b1d
5、Valgrind 使用
- 编译程序时开启-g选项,如果没有调试信息,Valgrind无法定位异常代码位置。
- 如果待调试的是C++程序,考虑去掉函数内联调用(开启-fno-inline),这样可以更简单的查看 函数调用堆栈。或者,使用Valgrind选项–read-inline-info = yes可以读取内联函数的调试信
息,这样,即便程序使用了内联函数也能正确的显示调用堆栈信息。
关闭编译优化(-O)。在O1以上的优化级别下,memcheck工具会误报一些未初始化值的错 误。
- 使用-Wall编译代码,他能识别Valgrind在较高优化级别上可能会遗漏的部分。
- 如果程序是通过脚本启动的,可以修改脚本里启动程序的代码,或者使用 --trace- children=yes 选项来运行脚本。
常用内存检测命令
valgrind --log-file=./valgrind_report.log --leak-check=full --show-leak-kinds=all --show- reachable=no --track-origins=yes ./main
输出检测报告如图:
- 左边显示类似行号的数字(10297)表示的是 Process ID。
- 中间表示 valgrind 通过运行被测试程序,发现的内存问题。通过阅读这些信息,可以发现:
- 这是一个对内存的非法读操作,非法写操作的内存是 8 bytes。
- 发生错误时的函数堆栈,以及具体的源代码行号。
- 非法读操作的具体地址空间。

valgrind输出结果会报告5种内存泄露,"definitely lost", "indirectly lost", "possibly lost", "still reachable", and "suppressed"。这五种内存泄露分析如下:
| definitely lost | 确认丢失,程序中存在内存泄露,应尽快修复。 当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法 访问这块内存则会报这个错误。 |
| indirectly lost | 间接丢失。当使用了含有指针成员的类或结构时可能会报这个错误。这类错误无需直接修复,他们总是与"definitely lost"一起出现,只要修复"definitely lost"即可 |
| possibly lost | 可能丢失。大多数情况下应视为与"definitely lost"一样需要尽快修复,除非你的程序让一个指针指向一块动态分配的内存(但不是这块内存起始地址),然后通过运 算得到这块内存起始地址,再释放它。 当程序结束时如果一块动态分配的内存没有被释放且通过程序内的指针变量均无法 访问这块内存的起始地址,但可以访问其中的某一部分数据,则会报这个错误。 |
| still reachable | 可以访问,未丢失但也未释放。如果程序是正常结束的,那么它可能不会造成程序崩溃,但长时间运行有可能耗尽系统资源,因此笔者建议修复它。如果程序是崩溃 (如访问非法的地址而崩溃)而非正常结束的,则应当暂时忽略它,先修复导致程序崩溃的错误,然后重新检测。 |
| suppressed | 已被解决。出现了内存泄露但系统自动处理了。 |
相关文章:
valgrind使用浅谈
1、Valgrind 简介 Valgrind是一款用于内存调试、内存泄漏检测以及性能分析的软件开发工具,它可在以下平台上运行: X86/Linux、AMD64/Linux、ARM/Linux、ARM64/Linux、PPC32/Linux、PPC64/Linux、PPC64LE/Linu x、S390X/Linux、MIPS32/Linux、MIPS64/Li…...
强化学习专题:强化学习知识梳理(一)
2024/6/23: 前段时间有幸完成了大学期间的第一篇论文。在面试之前复盘一下关于自己论文中DQN的一些相关点。 浅谈主要区别(在线 or 离线) 首先,一切的开始是强化学习中时序差分方程,这体现了强化学习方法的优化策略。在…...
深入JVM:详解JIT即时编译器
文章目录 深入JVM:详解JIT即时编译器一、序言二、基础概念1、何为JIT即时编译2、热点代码 三、HotSpot内置的即时编译器1、C1编译器2、C2编译器3、分层编译3.1 协作流程 四、常见JIT优化技术1、方法内联2、逃逸分析(1)同步锁消除(…...
ORBSLAM3_ROS_Ubuntu18_04环境搭建安装
orbslam3安装 ORB-SLAM3配置及安装教程(2023.3)_orbslam3安装-CSDN博客 换源,换成国内的 搜索software 安装工具 sudo apt install git sudo apt update sudo apt install gcc g cmake安装 cmake安装新版本 ubuntu20.04安装cmake详细…...
【opencv - C++ - Ubuntu】putText 显示中文最快方法
话不多说,直接上代码 #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/freetype.hpp>using namespace std; using namespace cv;int main(void) {Mat image(1000, 1800, CV_8UC3, Scalar(200,162,33));Ptr<freetype::F…...
百度网盘下载速度慢的解决办法
目录 一、背景 二、解决办法 1、点击三个竖点,再点设置 2、点击传输,再点击去开启该功能 3、点击同意,开启优化速率 三、结果 四、备注 一、背景 当你不是百度网盘会员时,你在使用百度网盘下载时,是否下载速度太…...
Python api接口 异步
Python API接口异步编程简介 在现代的软件开发中,大多数应用都需要通过API接口与其他系统进行交互。Python是一种非常流行的编程语言,因此许多开发者选择使用Python来构建他们的API接口。在一些情况下,API接口需要进行异步编程,以…...
Java 和 Kotlin 单例模式写法对比
目录 1、饿汉模式 Java 写法: Kotlin 写法: Kotlin 这段代码反编译&简化后如下: 2、懒汉模式,静态同步方法 Java 写法: Kotlin 写法: Kotlin 这段代码反编译&简化后如下: 3、懒…...
解析connectionReset异常的原因与解决方案
解析connectionReset异常的原因与解决方案 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Java中connectionReset异常的原因及其解决方案。这…...
mindspore打卡第9天 transformer的encoder和decoder部分
mindspore打卡第9天 transformer的encoder和decoder部分 import mindspore from mindspore import nn from mindspore import ops from mindspore import Tensor from mindspore import dtype as mstypeclass ScaledDotProductAttention(nn.Cell):def __init__(self, dropout_…...
Python实现IPv4地址和16进制互相转换
Python实现IPv4地址和16进制互相转换 import socketdef ip_to_hex16(ipaddr):# 使用 socket 库中的方法将IP地址转换为网络字节序的二进制表示hex_bytes socket.inet_aton(ipaddr)# 将二进制数据转换为整数, 其中byteorderbig 表示使用大端字节序(从高位到低位&…...
计算机视觉 | 基于图像处理和边缘检测算法的黄豆计数实验
目录 一、实验原理二、实验步骤1. 图像读取与预处理2. 边缘检测3. 轮廓检测4. 标记轮廓序号 三、实验结果四、完整代码 Hi,大家好,我是半亩花海。 本实验旨在利用 Python 和 OpenCV 库,通过图像处理和边缘检测算法实现黄豆图像的自动识别和计…...
深入分析 Android BroadcastReceiver (七)
文章目录 深入分析 Android BroadcastReceiver (七)1. 高级应用场景1.1 示例:动态权限请求1.2 示例:应用内通知更新 2. 安全性与性能优化2.1 示例:设置权限防止广播攻击2.2 示例:使用 LocalBroadcastManager2.3 示例:在…...
C++中的数据结构
一.STL标准库 结构:STL中有六大组件,分别是:容器,算法,迭代器,仿函数,配接器,配置器;以下分别介绍这六大组件中的最主要的三个。 1.容器 容器来配置存储空间,算法通过…...
武汉星起航:一站式服务,助力亚马逊卖家高效运营,实现收益飞跃
在跨境电商的浪潮中,武汉星起航电子商务有限公司以其独特的一站式跨境电商服务,为众多亚马逊卖家提供了强有力的支持,助力他们在不断发展的市场中脱颖而出,实现收益的大幅提升。 武汉星起航的一站式跨境电商服务,以其…...
从灵感到实践:Kimi辅助完成学术论文选题的文艺之旅
学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 昨天我们为大家介绍了ChatGPT辅助完成实现设计(AI与学术的交响:ChatGPT辅助下的实验设计新篇章)。今天我们再来看看Kimi对于论文选题都能提供哪些帮助…...
华为od-C卷200分题目4 -电脑病毒感染
华为od-C卷200分题目4 -电脑病毒感染 一个局域网内有很多台电脑,分别标注为0 - N-1的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t表示。其中网络内一个电脑被病毒感染,其感染网络内所有的电脑需要最少需要多长…...
show-overflow-tooltip 解决elementui el-table标签自动换行的问题
elementui中 el-table中某一行的高度不想因为宽度不够而撑开换行展示的解决方法。可通过show-overflow-tooltip属性解决,如下 代码是这样的 <el-table-column width"80" prop"id" label"ID"></el-table-column> <el…...
数字社交的领航者:解析Facebook的引领作用
在当今数字化社会中,社交网络已经成为了人们日常生活不可或缺的一部分。而在众多社交平台中,Facebook凭借其巨大的用户基础和创新的技术应用,被公认为数字社交领域的领航者之一。本文将深入解析Facebook在数字社交中的引领作用,探…...
深度分析 Apache Flink 窗口机制
什么是 Flink 窗口? Apache Flink 是一个用于处理实时流数据的开源框架,其核心功能之一是窗口(Window)机制。窗口是 Flink 在处理流数据时用于划分数据流的逻辑概念,它将无限的流数据切割成有限的、可管理的部分&…...
provision-cli:构建组织级基础设施即代码标准化工作流
1. 项目概述:一个为组织级基础设施管理而生的命令行工具如果你在管理一个稍具规模的技术团队,或者负责一个拥有多个项目、环境(开发、测试、生产)的软件产品,那么你一定对“基础设施即代码”这个概念不陌生。但当你真正…...
copy4ai:专为AI工作流设计的智能复制工具,解决网页内容格式粘贴难题
1. 项目概述:一个为AI工作流设计的智能复制工具最近在折腾各种AI工具链的时候,我经常遇到一个挺烦人的问题:想把网页上的一段代码、一个表格,或者是一段带有特殊格式的文本,原封不动地喂给ChatGPT或者Claude࿰…...
基于图像识别的UI自动化测试:从OpenCV模板匹配到实战应用
1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫GoatInAHat/openclaw-paperbanana。光看这个名字,你可能会觉得有点摸不着头脑——“山羊在帽子里”和“纸香蕉”是什么组合?但如果你对自动化测试、特别是UI自动化领域有所涉猎…...
【开源】电商运营场景的 Agent :EcomPilot经营诊断神器 附github
github地址 https://github.com/baibai-awd/ecommerce-ops-agent一个面向电商运营场景的 Agent 项目:EcomPilot 电商经营诊断 Agent。这个项目不是简单的聊天机器人,而是围绕真实业务流程设计的智能分析系统。它可以自动读取电商运营数据,分析…...
科技史上的今天:5月14日-百年技术沉淀,引领时代变革
2015年:HTTP/2 正式发布2015年5月14日,HTTP/2 标准正式发布,作为HTTP/1.1的重大升级,采用二进制分帧、多路复用等技术,解决串行阻塞痛点,显著提升网页加载速度与传输效率,为现代Web及物联网通信…...
【LangChain】 Runnable 链式调用深度解析:从 `itemgetter` 到 `RunnableLambda`
LangChain Runnable 链式调用深度解析:从 itemgetter 到 RunnableLambda本文基于 LangChain 框架,深入解析 Runnable 链式调用中的核心机制,重点剖析 itemgetter、| 管道符以及 RunnableLambda 的用法与设计哲学。一、从一个典型示例说起 先看…...
Smiley Sans字体如何在商业项目中合规使用?三步解决开源字体版权风险
Smiley Sans字体如何在商业项目中合规使用?三步解决开源字体版权风险 【免费下载链接】smiley-sans 得意黑 Smiley Sans:一款在人文观感和几何特征中寻找平衡的中文黑体 项目地址: https://gitcode.com/gh_mirrors/smi/smiley-sans 在商业项目中选…...
FPGA新手避坑指南:手把手教你写第一个仿真文件(tb.v),告别波形看不懂
FPGA仿真入门实战:从零编写Testbench到波形解析全攻略 引言 第一次接触FPGA仿真时,看着屏幕上跳动的波形图,那种茫然感我至今记忆犹新。明明代码看起来没问题,但仿真结果就是不对劲;或者更糟——根本不知道这些波形在表…...
终极指南:如何在Windows上安装APK文件?3分钟学会跨平台应用安装
终极指南:如何在Windows上安装APK文件?3分钟学会跨平台应用安装 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否想在Windows电脑上直接运…...
AI 与钓鱼即服务重构电子邮件威胁格局及防御体系研究
摘要 2026 年电子邮件威胁呈现工业化、智能化、隐蔽化演进趋势,钓鱼攻击占恶意邮件活动比例达 48%,90% 的大规模钓鱼活动依托钓鱼即服务(Phishing‑as‑a‑Service, PhaaS)平台开展,攻击载荷从传统文件型恶意代码转向 …...
