首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用"Microsoft Windows调试工具“检测内存泄漏

使用"Microsoft Windows调试工具“检测内存泄漏
EN

Stack Overflow用户
提问于 2020-10-16 06:44:24
回答 1查看 921关注 0票数 1

我们在内存泄漏检测方面遇到了麻烦。我们有一个使用Visual C++ 2008开发的应用程序。已在应用程序中检测到内存泄漏。我们可以在任务管理器中看到这个内存泄漏。还会使用外部监视脚本(为Microsoft,cscript.exe编写)自动检测泄漏。两种泄漏的内存都是相同的。

从脚本中,我们使用WMI ActiveX请求有关进程内存的信息:

代码语言:javascript
运行
复制
var wmi  = GetObject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");
….
select * from Win32_PerfRawData_PerfProc_Process where Name like '"+processName+"%'
….

我们分析了Win32_PerfRawData_PerfProc_Process: PrivateBytes WorkingSet类的这些性质。

在我们的应用程序中,为了查找内存泄漏分配,我们使用Microsoft调试工具。首先,我们配置g阻隔+ umdh: /i process.exe +ust -hpc -hfc

然后我们创建堆栈跟踪日志。在应用程序运行时,我们定期这样做:

代码语言:javascript
运行
复制
umdh.exe –p:%pid% > log1
umdh.exe –p:%pid% > log2
…
umdh.exe –p:%pid% > logN

当堆栈跟踪信息被累积时,我们使用以下命令创建报告:

代码语言:javascript
运行
复制
umdh.exe  -d  log1  log2  > cmp1-2
umdh.exe  -d  log2  log3  > cmp2-3

通常情况下,我们可以使用这种技术检测分配问题,然后消除这些问题。这个工具包帮助我们找到了一些真正的内存泄漏。在消除了该技术发现的所有漏洞之后,我们可以看到我们的应用程序在测试PC上使用了稳定的内存数量。

但是,在我们的应用程序发布后,我们再次看到内存泄漏,在我们客户的一些个人电脑上。我们通过前面描述的WMI ActiveX工具远程检测到了它。然后,我们要求客户端提供完整的OS映像,并在该映像上复制内存泄漏。我们看到进程使用的内存不断增长(在24小时内~50 We ),然后我们在这个OS映像上尝试了gflags+umdh,但是没有看到任何额外的内存泄漏。

以下是问题:

  1. 为什么WMI请求和MS调试工具所报告的泄漏内存数量会有所不同?
  2. 我们可以尝试哪些其他技术来检测内存泄漏?
  3. ,也许,我们应该在g标志中设置一些附加标志?如果是,这些标志是什么?
EN

回答 1

Stack Overflow用户

发布于 2020-10-16 07:00:29

所使用的工具(任务管理器等)似乎测量内存消耗。内存消耗的增加可能是由直接内存泄漏(没有new而没有delete)造成的,也可能是由间接泄漏引起的。

后一种形式发生在您已经分配了内存,停止使用该内存,并仍然有理论上的能力来释放它,但您的程序只有在关闭时才会这样做。操作系统不知道你的程序的细节,所以它不能区分这两种情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64384153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档