windows下的内存泄露检测工具VLD使用

article/2025/9/18 15:26:18

windows下的内存泄露检测工具VLD使用

  • 1.写在前面
  • 2.VLD简介
  • 3.VLD配置
    • 3.1.源码中添加头文件
    • 3.2.配置VLD
    • 3.3.内存泄漏检测报告解读
  • 4.结束语

1.写在前面

C/C++ 开发常常面临内存泄露问题的困扰,为了保证代码的交付质量,内存泄露检测是十分重要且必要的。本文以实际项目作为切入点,介绍windows下的一个内存泄露检测工具的用法,作为备忘/互相交流之用,不足之处还请批评指正。

2.VLD简介

VLD是一款可用于windows平台C/C++免费内存泄漏检查工具,相对使用比较方便,可以作为开发检测的一种手段,用以提高代码质量,它有如下优点
1)能够得到内存泄漏位置的调用堆栈,并且可以显示泄露位置所在的文件名及行号;
2)能够获得泄漏内存的完整数据;
3)用户可以自定义设置内存泄漏报告的级别;
4)以动态库的形式提供,源码需要做少许改动
5)源代码使用GNU许可发布,并有详细的文档及其注释。
VLD简单易用,只需要在源码中做少许改动,程序执行完毕后就能够输出内存泄露报告,下面就结合实际的代码来介绍该工具的使用。

3.VLD配置

首先可以从 https://kinddragon.github.io/vld/ 下载VLD进行安装,安装完毕后在安装目录下会看到如下几个文件夹:
在这里插入图片描述
这里可以根据自己的程序运行平台选择对应的库,本文选择 vld_x86.dll、dbghelp.dll、vld.lib、vld.ini、Microsoft.DTfW.DHL.manifest 这几个文件作为本次实例检测运行的依赖。

3.1.源码中添加头文件

在需要进行内存泄露检测的源码中首行添加#incude<vld.h>,VS工程中属性中 Linker->Input->Additional Dependencies,添加vld.lib,如下图所示:
在这里插入图片描述
在debug模式下将SDK编译出dll库(注:VLD默认在debug模式下开启, 本例中检测SDK内存泄露位置,事先已经在源码中添加了一行内存分配的代码,图中第51行,但是未进行释放,如下图所示)
在这里插入图片描述

3.2.配置VLD

将 vld_x86.dll、dbghelp.dll、vld.ini、Microsoft.DTfW.DHL.manifest 这几个文件一并拷贝到可执行文件的目录下,打开vld.ini文件,找到如下两个配置项:
ReportFile =.\memory_leak_report.txt //配置内存泄露检测报告文件的输出位置及检测报告文件名
ReportTo = both

配置完成后保存,再次检查一下可执行文件目录下的文件,同时将之前编译出的debug版本的dll库拷贝到可执行目录下,运行可执行文件,程序执行完并关闭后,此时会看到根目录下生成一个内存泄露检测报告:memory_leak_report.txt
在这里插入图片描述

3.3.内存泄漏检测报告解读

memory_leak_report.txt中的内容如下:
Visual Leak Detector Version 2.5.1 installed.
Outputting the report to the debugger and to D:\WorkSpace\SecureCard\branch\v1.0.1\sample\MFC_Demo\Release\memory_leak_report.txt
WARNING: Visual Leak Detector detected memory leaks!
---------- Block 1 at 0x00FC6358: 512 bytes ----------
Leak Hash: 0x5537415D, Count: 1, Total 512 bytes
Call Stack (TID 4216):
ucrtbased.dll!malloc()
d:\workspace\securecard\branch\v1.0.1\src\source\secureukey.cpp (51): SecureCard.dll!SKF_EnumDev() + 0xD bytes
d:\workspace\securecard\branch\v1.0.1\sample\mfc_demo\sdcryptostortool\secureukeytooldlg.cpp (223): SecureUKeyDemo.exe!CSDCryptoStorToolDlg::OnBnClickedBtnRefresh()
d:\workspace\securecard\branch\v1.0.1\sample\mfc_demo\sdcryptostortool\secureukeytooldlg.cpp (138): SecureUKeyDemo.exe!CSDCryptoStorToolDlg::OnInitDialog()
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgcore.cpp (28): SecureUKeyDemo.exe!AfxDlgProc() + 0x4 bytes
USER32.dll!AddClipboardFormatListener() + 0x4B bytes
USER32.dll!EnumChildWindows() + 0xCDE bytes
USER32.dll!EnumChildWindows() + 0x3D0 bytes
USER32.dll!wvsprintfA() + 0x2D5 bytes
USER32.dll!AddClipboardFormatListener() + 0x4B bytes
USER32.dll!GetClassLongW() + 0x7AA bytes
USER32.dll!GetSystemMetricsForDpi() + 0x1747 bytes
USER32.dll!CallWindowProcA() + 0x1B bytes
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp (1106): SecureUKeyDemo.exe!CWnd::DefWindowProcA() + 0x7 bytes
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp (297): SecureUKeyDemo.exe!CWnd::Default() + 0x4 bytes
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp (2093): SecureUKeyDemo.exe!CWnd::WindowProc() + 0x4 bytes
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp (268): SecureUKeyDemo.exe!AfxCallWndProc()
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\wincore.cpp (417): SecureUKeyDemo.exe!AfxWndProc() + 0x10 bytes
USER32.dll!AddClipboardFormatListener() + 0x4B bytes
USER32.dll!GetClassLongW() + 0x7AA bytes
USER32.dll!GetClassLongW() + 0x3AA bytes
USER32.dll!CallNextHookEx() + 0x19F bytes
ntdll.dll!KiUserCallbackDispatcher() + 0x4D bytes
USER32.dll!RegisterClassExW() + 0xB96 bytes
USER32.dll!CreateDialogIndirectParamAorW() + 0x35 bytes
USER32.dll!CreateDialogIndirectParamA() + 0x1B bytes
f:\dd\externalapis\windows\8.1\sdk\inc\winuser.inl (547): SecureUKeyDemo.exe!IsolationAwareCreateDialogIndirectParamA() + 0x15 bytes
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgcore.cpp (363): SecureUKeyDemo.exe!CWnd::CreateDlgIndirect()
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgcore.cpp (460): SecureUKeyDemo.exe!CWnd::CreateRunDlgIndirect() + 0x10 bytes
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\dlgcore.cpp (633): SecureUKeyDemo.exe!CDialog::DoModal() + 0x14 bytes
d:\workspace\securecard\branch\v1.0.1\sample\mfc_demo\sdcryptostortool\secureukeytool.cpp (78): SecureUKeyDemo.exe!CSDCryptoStorToolApp::InitInstance()
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\winmain.cpp (37): SecureUKeyDemo.exe!AfxWinMain() + 0x4 bytes
f:\dd\vctools\crt\vcstartup\src\startup\exe_common.inl (253): SecureUKeyDemo.exe!__scrt_common_main_seh() + 0x1A bytes
KERNEL32.DLL!BaseThreadInitThunk() + 0x19 bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0x11E bytes
ntdll.dll!RtlGetAppContainerNamedObjectPath() + 0xEE bytes
Data:
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …
CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD … …

Visual Leak Detector detected 1 memory leak (548 bytes).
Largest number used: 844 bytes.
Total allocations: 844 bytes.
Visual Leak Detector is now exiting.

从上述报告内容中可以看到,工具检测到dll库中的一处内存泄露,泄露位置位于 secureukey.cpp文件中第 51行 ,在函数SKF_EnumDev()内部,存在512 bytes内存泄露,正是我们预先分配未释放的位置:
Leak Hash: 0x5537415D, Count: 1, Total 512 bytes
d:\workspace\securecard\branch\v1.0.1\src\source\secureukey.cpp (51): SecureCard.dll!SKF_EnumDev() + 0xD bytes

报告中还列出了更为详细的堆栈信息,便于对代码进行定位和分析,这里就不再进行详细的说明,有兴趣的话可以网上搜索更多信息进行学习。
当然用户也可以在Visual studio中配置vld,相关信息请自行搜索,此处不作介绍。

4.结束语

windows下内存泄露检测工具有很多,本文只列出VLD的使用,想了解更多内存泄露检测工具的使用,请自行搜索学习。作为C/C++开发,掌握简单的内存泄漏分析手段可以说是十分有必要的,掌握方法的同时也能加深对内存相关知识的理解。


http://chatgpt.dhexx.cn/article/0nCmnb3Z.shtml

相关文章

php安装vld扩展

1、查看本地是否已经安装了vld扩展&#xff0c;如果没有任何输出&#xff0c;那就准备安装吧&#xff01; [roottaiwu ~]# /home/work/lib/php5.6.7/bin/php -m | grep vld2、去官方网站下载vld&#xff08;http://pecl.php.net/package/vld&#xff09;, 找到最新版本&#x…

Visual C++ 内存泄露检测工具(VLD)

一、内存泄漏 1、什么是内存泄露 由于疏忽或者错误&#xff08;异常安全&#xff09;导致程序未能释放已经不再使用的内存的情况。内存泄露并非是指内存在物理上的消失&#xff0c;而是指程序失去了对该内存的控制&#xff0c;导致的资源浪费。 2 、内存泄露的分类 a、堆内存…

Qt Creator 安装 VLD

Qt Creator 安装 VLD 2015-04-14 16:52:55 你好L 阅读数 2325更多 分类专栏&#xff1a; qt 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/lin…

vld检测不输出_原创干货 | 基于机器学习的webshell检测踩坑小记

目录 “文章部分内容引用自兜哥作品” 0x01 机器学习衡量指标 0x02 数据集 0x03 特征提取 0x04 模型训练及检测 0x05 预测新样本 0x06 优化检测 前言 本人是合合信息(划重点——“OCRAI大数据公司”)安全部门的一名成员&#xff0c;受到公司AI氛围的感染&#xff0c;对于不会AI…

使用 VLD 检测内存泄漏

背景 在实际的项目实践中&#xff0c;随着程序越复杂&#xff0c;内存管理就显得越重要。虽然有许多方法可以防止内存泄露&#xff0c;但在实践中还是难免出现内存泄露的情况&#xff0c;并且内存泄露问题很难被发现和定位其位置。 VLD Visual Leak Detector 是一款用于 C 的…

使用vld查看OPCode

本文转载自&#xff1a;https://gywbd.github.io/posts/2016/2/vld-opcode.html 前几天翻译了一篇关于Zend引擎的文章&#xff0c;这篇文章主要是讲Zend引擎怎么执行PHP代码的&#xff0c;确切地说是怎么执行OPCode的&#xff0c;因为PHP程序会先被编译为中间形式&#xff08;…

php windows vld,PHP之opcode及VLD使用

OpCode&#xff0c;即Operation Code&#xff0c;操作码。通常是指计算机指令中的一部分&#xff0c;用于指定要执行的操作&#xff0c; 指令的格式和规范由处理器的指令规范指定。 通常opcode还有另一种称谓&#xff1a;字节码(byte codes)。例如Java编译后生成的class文件。 …

vld扩展

PHP代码的执行实际上是在执行代码解析后的各种opcode。通过vld扩展可以很方便地看到执行过程中的opcode。 一、安装vld扩展 git clone https://github.com/derickr/vld.git cd vld phpize ./configure --with-php-config/usr/local/php71/bin/php-config --enable-vld make &am…

vld使用

vld是一款免费的Visual C内存分析工具&#xff0c;下面来介绍一下怎么在qt中使用vld。 1.下载。去官网http://vld.codeplex.com/下载&#xff0c;我下的是2.5.1版本 2.安装。在安装目录下找到vld.lib文件。有32位和64位的注意位数。复制到qt安装目录的lib文件夹中 复制vld安装…

WINDOWS下内存泄漏检测工具VLD(Visual Leak Detector)的使用

VLD安装&#xff1a; https://kinddragon.github.io/vld/ 点击下载安装器 安装完成后&#xff0c;会自动将其include目录添加到VS的附加安装目录&#xff0c;将其静态库目录(lib目录)添加到VS的附加库目录&#xff0c; 无需手动添加include目录和lib目录 VLD使用&#xff1…

VLD(Visual LeakDetector)内存泄露库的使用

VLD简介 由于C/C语言没有所谓的垃圾收集器&#xff0c;内存的分配和释放都需要程序员自己来控制&#xff0c;这会给C/C程序员带来一定的困难。当您的程序越来越复杂时&#xff0c;它的内存管理也会变得越来越困难。内存泄漏、内存越界是最常见的内存问题之一。内存泄漏如果不是…

内存泄漏查找工具VLD的使用

1.什么是vld&#xff1f; Visual Leak Detector(VLD)同样是一款开源检测内存泄露软件的简称。 官方的介绍如下地址&#xff1a;在Visual Studio调试器下运行程序时&#xff0c;Visual Leak检测器将在调试会话结束时输出内存泄漏报告。泄漏报告包括完整的调用堆栈&#xff0c;显…

检查内存泄露的利器--VLD使用指南

1. VLD简介 Visual Leak Detector是一个免费的&#xff0c;强大的&#xff0c;开源的,可视化C 内存泄漏检测工具。 VLD容易使用。安装后&#xff0c;只需告诉Visual C 在哪里可以找到包含的头文件和库文件。然后&#xff0c;只需将以下行添加到代码中&#xff0c;即可将其与任…

内存泄露检测工具VLD(Visual Leak Detector)使用说明

目录 一、内存泄漏问题 二、VLD工具使用说明 1 下载VLD 2 安装VLD 3 使用VLD&#xff08;第一个种方法&#xff09; 3.1 附加头文件目录 3.2 附加库目录。 4 使用VLD&#xff08;第二个种方法&#xff09; 4.1 打包VLD_SDK 4.2 附加头文件目录 4.3 附加库目录。 5 …

【矩阵论】范数和矩阵函数(2)

范数及矩阵函数之收敛性与矩阵函数 定义矩阵的范数是为了讨论矩阵的收敛性。 注&#xff1a;范数和矩阵函数这个系列的&#xff08;1&#xff09;&#xff08;2&#xff09;等划分是按照章节来的&#xff0c;与视频的分集并不完全一致。 一. 收敛定理 1. 按坐标收敛 2. 按范数…

向量范数和矩阵范数的理解

向量范数 今天来聊一聊机器学习矩阵论的相关知识——范数&#xff08;Norm&#xff09;。 在学习机器学习基础算法的推导过程中&#xff0c;可以看到很多地方都应用到了这个范数。范数属于矩阵论的知识范围&#xff0c;可见数学基础的重要性。 机器学习的数学基础重点推荐—…

【矩阵论】范数和矩阵函数(1)

范数及矩阵函数之范数的概念 首先将本章的内容做以下大致的梳理&#xff1a; 我们通过范数的概念来解决矩阵函数的问题&#xff0c;利用矩阵的函数可以解决很多实际问题。 一. 概念与定义 1. 范数与赋范线性空间 &#xff08;1&#xff09;范数——向量空间上的满足某些性质…

矩阵范数与矩阵的模

矩阵范数&#xff08;matrix norm&#xff09;是数学中矩阵论、线性代数、泛函分析等领域中常见的基本概念&#xff0c;是将一定的矩阵空间建立为赋范向量空间时为矩阵装备的范数。应用中常将有限维赋范向量空间之间的映射以矩阵的形式表现&#xff0c;这时映射空间上装备的范数…

【数学】向量范数和矩阵范数(几种范数 norm 的简单介绍)

目录&索引 一、什么是范式&#xff1f;二、向量范式1-范数2-范数P-范数∞-范数-∞-范数 三、矩阵范式1-范数2-范数∞-范数F-范数 四、小结 一、什么是范式&#xff1f; 范数&#xff0c;是具有“长度”概念的函数。在线性代数、泛函分析及相关的数学领域&#xff0c;范数是…

鬼畜视频制作必备——vegas pro特别版歌声合成工具UTAU

很好奇鬼畜是怎么做出来的&#xff1f;绝大部分up主用的必备的就是vegas&#xff0c;剪视频比较全能&#xff0c;比如&#xff1a;添加字幕、旋转视频、导入导出视频、导入导出视频等等&#xff0c;同时还提供了先进的悬停取消技术、高分辨率格式高达4K的音频素材以及支持4K UH…