在windows系统中,内存泄露问题一直是一个棘手的挑战。我之前已经分享过两篇关于这个主题的文章。然而,对于拥有丰富调试经验的开发者来说,仅凭一种工具或方法通常难以覆盖所有场景,特别是在面对庞大项目时。本文将介绍微软提供的debugdialog工具,它不仅能用于分析hang和性能问题,还能有效地处理内存泄露问题。对于内存泄露,debugdialog将生成一个详尽的报告,省去了使用windbg命令手动分析内存的繁琐过程,非常适合新手使用。
首先,我们将展示一段典型的内存泄露代码。每20秒,这段代码将导致4M内存泄露。
#include #include #includedefine 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 <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,首先配置好符号文件目录。

存了个图
视频图片解析/字幕/剪辑,视频高清保存/图片源图提取
17 查看详情
然后选择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:testtestmemoryleaksource.cpp @ 24 + a)找到内存泄露的具体位置。

通过以上步骤和分析,DebugDialog为我们提供了强大的工具来定位和解决Windows系统中的内存泄露问题。
以上就是Windows内存泄露分析之DebugDialog的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/227514.html
微信扫一扫
支付宝扫一扫