我们在内存泄漏检测方面遇到了麻烦。我们有一个使用Visual C++ 2008开发的应用程序。已在应用程序中检测到内存泄漏。我们可以在任务管理器中看到这个内存泄漏。还会使用外部监视脚本(为Microsoft,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: PrivateBytes WorkingSet类的这些性质。
在我们的应用程序中,为了查找内存泄漏分配,我们使用Microsoft调试工具。首先,我们配置g阻隔+ umdh: /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上使用了稳定的内存数量。
但是,在我们的应用程序发布后,我们再次看到内存泄漏,在我们客户的一些个人电脑上。我们通过前面描述的WMI ActiveX工具远程检测到了它。然后,我们要求客户端提供完整的OS映像,并在该映像上复制内存泄漏。我们看到进程使用的内存不断增长(在24小时内~50 We ),然后我们在这个OS映像上尝试了gflags+umdh,但是没有看到任何额外的内存泄漏。
以下是问题:
发布于 2020-10-16 07:00:29
所使用的工具(任务管理器等)似乎测量内存消耗。内存消耗的增加可能是由直接内存泄漏(没有new而没有delete)造成的,也可能是由间接泄漏引起的。
后一种形式发生在您已经分配了内存,停止使用该内存,并仍然有理论上的能力来释放它,但您的程序只有在关闭时才会这样做。操作系统不知道你的程序的细节,所以它不能区分这两种情况。
https://stackoverflow.com/questions/64384153
复制相似问题