使用“ 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)引起的,也可能是由间接泄漏引起的。

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...