专栏首页一个程序员的修炼之路Windows内存泄露分析之DebugDialog

Windows内存泄露分析之DebugDialog

Windows中内存泄露的文章本人已经写过两篇<<Windows程序内存泄漏(Memory Leak)分析之UMDH>><<Windows程序内存泄漏(Memory Leak)分析之Windbg>>。如果有丰富调试经验的同学会发现,很难用一种工具或者方法去分析所有的场景,尤其当工程庞大的时候。本文要介绍的就是微软提供的DebugDialog, 他可以用于分析Hang,性能问题,内存泄露问题等等。对于内存泄露问题,DebugDialog分析后会给出一个完整的Report,免去了你通过Windbg命令去分析内存的过程,适合于新人。

样例代码

按照惯例我们先写了一段内存泄露的代码,每隔20秒,造成4M内存泄露。

#include <iostream>
#include <chrono>
#include <thread>

#define STR_SIZE 4*1024*1024
class TestClass
{
public:
    char m_str[STR_SIZE];
};

void MemoryLeakObj()
{
    TestClass * pObj = new TestClass;
    strcpy_s(pObj->m_str, STR_SIZE, "Memory Leak Sample");
    std::cout << pObj->m_str << std::endl;
}

int main()
{
    std::this_thread::sleep_for(std::chrono::seconds(30));
    while (true)
    {
        MemoryLeakObj();
        std::this_thread::sleep_for(std::chrono::seconds(20));
    }
    return 0;
}

DebugDialog内存泄露分析

第一步 打开DebugDialog Collection,选择你需要分析的问题的类型,比如我们想要分析的是Native Memory and Handle Leak问题。

第二步 选择你需要Monitor的正在运行的进程:

第三步 选择你需要产生Dump的时间,最少要配置15分钟,这个可以根据你项目产生Memory Leak的速度来决定。

第四步 然后Active你配置的Rule,则需要监测的进程被注入LeakTrack.dll用于辅助分析。接下来静心等待,直到产生了Dump文件。 第五步 开启DebugDialog Analysis, 先配置好符号文件目录:

然后选择MemoryAnalysis, 并且添加刚才Monitor后产生的Dump文件。点击Start Analysis进行分析。

DebugDialog 内存泄露报告分析

报告主要分为四个个部分,SummaryVirtual Memory AnalysisHeap AnalysisLeak Analysis

Summary

这里主要大概介绍内存申请的来源,比如下面ucrtbase.dll申请了180多M,那么可以知道这个程序内存泄露主要通过CRT库申请的内存泄露,也就是mallocnew。那么是哪里申请的呢?具体可以看Leak Analysis这一部分。

Virtual Memory Analysis

这一部分主要讲了虚拟内存的使用情况, 主要着重看下Committed MemoryNative Heaps,约为200M左右。也就是说主要是堆上消耗的内存比较多,一般来说内存泄露也是堆内存泄露。其他的还有可以直接通过VirtualAlloc,Memory Map等技术去使用内存。 这部分还会显示加载的一些模块基本信息,线程基本信息。

Heap Analysis

一个进程可以有多个堆,我们使用的是VS2015编译的,CRT库中malloc申请内存使用的是系统默认堆(Default Process Heap)。注意到其已经提交了197.81M的内存。

Leak Analysis

这一部分才是内存泄露的关键部分,会列出详细的内存申请的位置和大小。首先注意查看的是Leak Probability 显示为100%, 非常值得怀疑的部分,其列举了申请内存为4M的函数调用栈,可以根据函数调用栈(d:\test\test\memoryleak\source.cpp @ 24 + a)寻找到内存泄露的地方。

本文分享自微信公众号 - 一个程序员的修炼之路(CoderStudyShare),作者:河边一枝柳

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

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

    之前本人写了一篇<<Windows程序内存泄漏(Memory Leak)分析之UMDH>>。这种方法有一定的局限性:

    河边一枝柳
  • vmmap分析内存泄露问题

    vmmap是sysinternals工具集中的一个工具,主要用于分析一个进程的虚拟内存和物理内存的使用情况。更有效的是,可以通过对比两个不同时间的内存使用情况的...

    河边一枝柳
  • 内存泄露排查之线程泄露

    top,观察内存占用率(这里图是重启之后一段时间的)但是cpu占用率比较高,很快就降下去了,这里耽误了一下时间,top -Hp pid,确认那个线程占用率高,j...

    Bug开发工程师
  • 内存泄露排查之线程泄露

    top,观察内存占用率(这里图是重启之后一段时间的)但是cpu占用率比较高,很快就降下去了,这里耽误了一下时间,top -Hp pid,确认那个线程占用率高,j...

    用户5224393
  • 记一次 JAVA 的内存泄露分析

    前不久,上线了一个新项目,这个项目是一个压测系统,可以简单的看做通过回放词表(http请求数据),不断地向服务发送请求,以达到压测服务的目的。在测试过程中,一切...

    芋道源码
  • Windows程序内存泄漏(Memory Leak)分析之UMDH

    小木发现线上的程序通过任务管理器发现内存不断的增长,怀疑是不是内存泄漏呢?用户态内存泄漏可能是句柄泄漏,堆内存泄露,Socket, GDI对象等等。而对于C++...

    河边一枝柳
  • 一个 Vue 页面的内存泄露分析

    什么是内存泄露?内存泄露是指new了一块内存,但无法被释放或者被垃圾回收。new了一个对象之后,它申请占用了一块堆内存,当把这个对象指针置为null时或者离开作...

    用户1272076
  • 如何使用Eclipse内存分析工具定位内存泄露

    本文以我司生产环境Java应用内存泄露为案例进行分析,讲解如何使用Eclipse的MAT分析定位问题

    Bug开发工程师
  • 基于HTML5的WebGL应用内存泄露分析

    上篇我们通过定制了CPU和内存展示界面,体验了HT for Web通过定义矢量实现图形绘制与业务数据的代码解耦及绑定联动,这类案例后续文章还会继续以便大家掌握更...

    HT for Web
  • 小题大做 | Handler内存泄露全面分析

    "内部类持有了外部类的引用,也就是Hanlder持有了Activity的引用,从而导致无法被回收呗。"

    码上积木
  • 基于HTML5的WebGL应用内存泄露分析

    HT_hightopo
  • golang 内存分析/内存泄漏

    进入交互式模式之后,比较常用的有 top、list、traces、web 等命令。

    用户5705150
  • troubleshoot之:使用JFR解决内存泄露

    虽然java有自动化的GC,但是还会有内存泄露的情况。当然java中的内存泄露跟C++中的泄露不同。

    程序那些事
  • troubleshoot之:使用JFR解决内存泄露

    虽然java有自动化的GC,但是还会有内存泄露的情况。当然java中的内存泄露跟C++中的泄露不同。

    子润先生
  • 分析和解决 JAVA 内存泄露的实战例子

    这几天,一直在为Java的“内存泄露”问题纠结。Java应用程序占用的内存在不断的、有规律的上涨,最终超过了监控阈值。福尔摩 斯不得不出手了!

    烂猪皮
  • Java常见问题分析(内存溢出、内存泄露、线程阻塞等)

    例:Object.finallize()、 Windows.dispose()、 System.gc()

    马士兵的朋友圈
  • Node.js内存泄漏分析

    蛋未明
  • Android内存泄漏分析

    强引用:类似“Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。

    用户1205080
  • Android性能优化——之防止内存泄露

    又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。

    用户3030674

扫码关注云+社区

领取腾讯云代金券