0

0

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

雪夜

雪夜

发布时间:2025-09-23 08:51:15

|

271人浏览过

|

来源于php中文网

原创

小木通过任务管理器观察到线上程序的内存持续增长,怀疑是内存泄漏的问题。用户态内存泄漏可能包括

句柄泄漏
堆内存泄漏
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:\symbolshttps://www.php.cn/link/f3a45758fe1e808fd1d41b62d7784a93
    来配置Symbol路径。

  4. 保存初始内存记录:运行命令

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

    Dreamlike.art
    Dreamlike.art

    内置5种模型的AI图像生成器

    下载
  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的使用后,对线上出现的实际问题进行分析,很快找到了内存泄漏的原因。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

359

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

558

2023.08.10

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

359

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

558

2023.08.10

自建git服务器
自建git服务器

git服务器是目前流行的分布式版本控制系统之一,可以让多人协同开发同一个项目。本专题为大家提供自建git服务器相关的各种文章、以及下载和课程。

635

2023.07.05

git和svn的区别
git和svn的区别

git和svn的区别:1、定义不同;2、模型类型不同;3、存储单元不同;4、是否拥有全局版本号;5、内容完整性不同;6、版本库不同;7、克隆目录速度不同;8、分支不同。php中文网为大家带来了git和svn的相关知识、以及相关文章等内容。

523

2023.07.06

git撤销提交的commit
git撤销提交的commit

Git是一个强大的版本控制系统,它提供了很多功能帮助开发人员有效地管理和控制代码的变更,本专题为大家提供git 撤销提交的commit相关的各种文章内容,供大家免费下载体验。

262

2023.07.24

git提交错误怎么撤回
git提交错误怎么撤回

git提交错误撤回的方法:git reset head^:撤回最后一次提交,恢复到提交前状态。git revert head:创建新提交,内容与之前提交相反。git reset :使用提交的 sha-1 哈希撤回指定提交。交互式舞台区:标记要撤回的特定更改,然后提交,排除已撤回更改。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

537

2024.04.09

笔记本电脑卡反应很慢处理方法汇总
笔记本电脑卡反应很慢处理方法汇总

本专题整合了笔记本电脑卡反应慢解决方法,阅读专题下面的文章了解更多详细内容。

1

2025.12.25

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6万人学习

Excel 教程
Excel 教程

共162课时 | 9.5万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 1.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号