微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用“ Microsoft Windows调试工具”进行内存泄漏检测

如何解决使用“ Microsoft Windows调试工具”进行内存泄漏检测

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

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

var wmi  = Getobject("winmgmts:{impersonationLevel=impersonate}!\\\\.\\root\\cimv2");
….
select * from Win32_PerfRawData_PerfProc_Process where Name like '"+processName+"%'
….

我们分析了Win32_PerfRawData_PerfProc_Process类的以下属性: 专用字节 WorkingSet

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

然后我们创建堆栈跟踪日志。我们在应用程序运行时定期执行此操作:

umdh.exe –p:%pid% > log1
umdh.exe –p:%pid% > log2
…
umdh.exe –p:%pid% > logN

积累了堆栈跟踪信息后,我们将使用以下命令进行报告:

umdh.exe  -d  log1  log2  > cmp1-2
umdh.exe  -d  log2  log3  > cmp2-3

通常,我们可以使用此技术检测分配问题,然后消除它们。 该工具包帮助我们找到了一些实际的内存泄漏。 消除了此技术发现的所有泄漏之后,我们可以看到应用程序使用了稳定的内存量 在我们的测试PC上。

但是在发布我们的应用程序之后,我们在某些客户端的PC上再次看到内存泄漏。 我们通过前面介绍的WMI ActiveX工具远程检测到它。 然后,我们要求客户提供完整的操作系统映像,并在此映像上复制了内存泄漏。 我们看到我们的过程使用的内存持续增长(24小时内约50Mb) 然后,我们在此OS映像上尝试了gflags + umdh,但看不到任何其他内存泄漏。

以下是问题:

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

解决方法

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

后一种形式发生在您分配了内存,停止使用该内存并仍具有理论上的取消分配内存的能力时,但是您的程序只会在关机时这样做。操作系统不了解您程序的详细信息,因此无法区分这两种情况。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。