当前位置:

首页 > 软件教程 > Windows内存泄漏分析:UMDH使用教程

Windows内存泄漏分析:UMDH使用教程

Windows 11
Windows 11

Windows 11 是微软全新操作系统,现代化界面,流畅操作体验,适用于学习、工作与日常生活。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

立即下载
¥159
Windows 2026-08-17
正版软件 Windows 操作系统 Windows 11 Windows下载

小木通过任务管理器观察到线上程序的内存持续增长,怀疑是内存泄漏的问题。用户态内存泄漏可能包括句柄泄漏、堆内存泄漏、Socket、GDI对象等。对于C++程序员来说,最常见的无疑是堆内存泄漏,即通过malloc或new从堆上申请的内存使用完后未被释放,导致程序使用的内存不断增加。为了分析这个问题,小木使用了UMDH,这是Windbg工具集中的一个强大工具,用于记录程序在不同时间点的堆内存申请信息,并通过比较两次记录来查找内存泄漏。小木首先编写了一个测试程序来熟悉工具的使用。该程序每隔十秒钟调用一次Memor

小木通过任务管理器观察到线上程序的内存持续增长,怀疑是内存泄漏的问题。用户态内存泄漏可能包括句柄泄漏、堆内存泄漏、Socket、GDI对象等。对于C++程序员来说,最常见的无疑是堆内存泄漏,即通过malloc或new从堆上申请的内存使用完后未被释放,导致程序使用的内存不断增加。

为了分析这个问题,小木使用了UMDH,这是Windbg工具集中的一个强大工具,用于记录程序在不同时间点的堆内存申请信息,并通过比较两次记录来查找内存泄漏。小木首先编写了一个测试程序来熟悉工具的使用。该程序每隔十秒钟调用一次MemorLeakFunction,在函数中从堆上申请一段内存空间但未释放。

#include 
#include 
#include 

void MemoryLeakFunction() { const int STR_SIZE = 100; char * pStr = new char [STR_SIZE]; strcpy_s(pStr, STR_SIZE, "Memory Leak Sample"); std::cout << "Memory allocated: " << pStr << std::endl; }

int main() { while (true) { MemoryLeakFunction(); std::this_thread::sleep_for(std::chrono::seconds(10)); } return 0; }

小木使用以下步骤来分析内存泄漏:

  1. 使用gflag工具:通过命令"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\gflags" -i MemoryLeak.exe +ust来配置MemoryLeak.exe程序,使其在申请堆内存时记录函数调用栈。图形化界面中开启Create user mode stack trace database选项。

    Windows程序内存泄漏(Memory Leak)分析之UMDH

  2. 运行测试程序MemoryLeak.exe。

  3. 配置Symbol文件:将程序的symbol文件MemoryLeak.pdb拷贝到mysymbols目录下,并运行命令Set _NT_SYMBOL_PATH=C:\mysymbols;SRVC:\symbolshttp://msdl.microsoft.com/download/symbols来配置Symbol路径。

  4. 保存初始内存记录:运行命令"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\umdh" -pn:MemoryLeak.exe -f:C:\umdhlog\begin.log来保存程序当前的堆内存申请记录到C:\umdhlog\begin.log。

  5. 等待一段时间后再次保存内存记录:假设等待5分钟后,运行命令"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\umdh" -pn:MemoryLeak.exe -f:C:\umdhlog\end.log来保存新的堆内存申请记录到C:\umdhlog\end.log。

  6. 比较两次内存记录:运行命令"C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\umdh" C:\umdhlog\begin.log C:\umdhlog\end.log -f:c:\umdhlog\diff.log来比较两次记录,找出增加的堆内存请求及其调用栈,并将结果导出到c:\umdhlog\diff.log。

在diff.log中,可以看到增加的内存申请的函数调用栈,例如:

+    1194 (  157c -   3e8)     37 allocs  BackTrace1

  •  2d (    37 -     a)  BackTrace1  allocations

    ntdll!RtlpAllocateHeap+212 ntdll!RtlpAllocateHeapInternal+5E5 ucrtbase!_malloc_base+36 MemoryLeak!operator new+1F (d:\agent_work\2\s\src\vctools\crt\vcstartup\src\heap\new_scalar.cpp, 35) MemoryLeak!main+2D (c:\personal\git\beyourbest\cpp\windbgsample\memoryleak\memoryleaksample.cpp, 17) MemoryLeak!__scrt_common_main_seh+10C (d:\agent_work\2\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl, 288) KERNEL32!BaseThreadInitThunk+14 ntdll!RtlUserThreadStart+21

其中,0x1194表示在这段时间内申请了4500个字节的堆空间,0x2d表示调用了45次。函数调用栈显示在memoryleaksample.cpp文件的第17行进行了内存申请,通过审查这段代码,可以发现未释放内存导致的内存泄漏。

小木在熟悉了UMDH的使用后,对线上出现的实际问题进行分析,很快找到了内存泄漏的原因。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
软件教程 Windows
相关文章 更多
windows如何卸载软件干净彻底清理残留教程
windows如何卸载软件干净彻底清理残留教程

想在Windows中干净卸载软件?本文详解从设置面板卸载、清理AppData配置、移除启动项及处理卸载失败的完整步骤,避免直接删除文件夹带来的残留问题。

格志日记安装配置详细步骤教程
格志日记安装配置详细步骤教程

了解格志日记的安装方法,熟悉日记本、问题库、模板及宫格记录界面。掌握提醒设置与数据同步要点,快速开启引导式日记记录。

windows系统安装教程详细步骤全过程图文指南
windows系统安装教程详细步骤全过程图文指南

详细讲解Windows系统安装步骤,包括使用Media Creation Tool制作启动U盘、BIOS/UEFI启动设置、磁盘分区选择及驱动激活检查。区分就地重装与全新安装,帮助用户安全完成系统部署。

如何在计算机上删除 linux 并安装 windows
如何在计算机上删除 linux 并安装 windows

想从 Linux 换回 Windows?本文详解制作安装介质、进入 BIOS/UEFI 启动菜单、删除 Linux 分区及安装 Windows 的全过程。重点提示数据备份与磁盘确认,避免误删其他硬盘数据。

radiant dicom viewer 新手使用教程
radiant dicom viewer 新手使用教程

初次使用 RadiAnt DICOM Viewer?本文带你认识软件主界面,包括系列预览栏、窗宽窗位、平移缩放及 ROI 测量工具的位置与用法,助你高效查看 DICOM 医学影像。

心情罐罐安装配置教程图文操作步骤详解
心情罐罐安装配置教程图文操作步骤详解

详细图解“心情罐罐”App在iPhone上的安装步骤、首次启动设置、心情记录操作及日历统计查看方法。包含主题调整与隐私管理建议,适合初次使用者快速上手。

阅流拍摄功能设置在哪及打开方法教程
阅流拍摄功能设置在哪及打开方法教程

找不到阅流拍摄的设置入口?本文按项目、设备和机位层级,图解说明如何打开设备管理、修改录制参数、设置上云目的地及进行直播监看。适用于视频拍摄团队的实时协作场景,解决权限与连接状态导致的菜单隐藏问题。

irreader数据同步教程详解阅读器同步设置方法
irreader数据同步教程详解阅读器同步设置方法

想知道如何在不同电脑间同步irreader订阅源?本文详解irreader账号同步设置、手动同步技巧,并区分源列表同步与本地数据迁移的区别,提供导出导入及likefeed.db文件复制方法,确保多设备阅读体验一致。

smartgit中文设置手册完整操作步骤详解
smartgit中文设置手册完整操作步骤详解

新手如何为 SmartGit 设置中文界面?本文详解 Edit > Preferences > User Interface 语言切换步骤,并图解 Standard、Working Tree 及 Log 窗口的功能分区,助你快速上手 Git 图形化管理。

windows显示语言为什么改不了中文及解决方法
windows显示语言为什么改不了中文及解决方法

遇到Windows界面无法切换为中文的情况?本文详解如何区分输入法与显示语言,排查单一语言版本限制,正确安装中文语言包并解决下载失败问题,助您快速恢复中文界面。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

WINDOWS 更多
3dmax(3ds max)
3dmax(3ds max)
Windows

Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

photoshop
photoshop
Windows、macOS 、 iPad

Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

Blender
Blender
Windows、macOS 和 Linux

Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

即将离开本站
您即将前往第三方网站,请确认是否继续?