在windows系统中,内存泄露问题一直是一个棘手的挑战。我之前已经分享过两篇关于这个主题的文章。然而,对于拥有丰富调试经验的开发者来说,仅凭一种工具或方法通常难以覆盖所有场景,特别是在面对庞大项目时。本文将介绍微软提供的debugdialog工具,它不仅能用于分析hang和性能问题,还能有效地处理内存泄露问题。对于内存泄露,debugdialog将生成一个详尽的报告,省去了使用windbg命令手动分析内存的繁琐过程,非常适合新手使用。
首先,我们将展示一段典型的内存泄露代码。每20秒,这段代码将导致4M内存泄露。
#include#include #include define STR_SIZE 410241024
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() { while (true) { MemoryLeakObj(); std::this_thread::sleep_for(std::chrono::seconds(20)); } return 0; }
接下来,我们将详细介绍如何使用DebugDialog来分析内存泄露问题。
第一步:启动DebugDialog Collection,选择你想要分析的问题类型。在本例中,我们选择Native Memory and Handle Leak。

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

第三步:设置产生Dump文件的时间,至少需要配置15分钟,具体时间可根据项目内存泄露的速度来调整。

第四步:激活你配置的规则,监控进程将被注入LeakTrack.dll以辅助分析。接下来耐心等待Dump文件的生成。
第五步:启动DebugDialog Analysis,首先配置好符号文件目录。

然后选择MemoryAnalysis,并添加之前监控后生成的Dump文件。点击Start Analysis开始分析。

DebugDialog内存泄露报告分析
报告主要分为四个部分:Summary,Virtual Memory Analysis,Heap Analysis和Leak Analysis。
-
Summary:这一部分简要介绍了内存申请的来源。例如,
ucrtbase.dll申请了180多M内存,这表明程序的内存泄露主要通过CRT库的malloc和new函数产生。具体的泄露点可以在Leak Analysis部分找到。

-
Virtual Memory Analysis:这一部分详细描述了虚拟内存的使用情况,重点关注
Committed Memory和Native 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)找到内存泄露的具体位置。

通过以上步骤和分析,DebugDialog为我们提供了强大的工具来定位和解决Windows系统中的内存泄露问题。








