我们的一个应用程序(Windows窗体应用程序C ++,MSVS 2010)在使用几分钟后崩溃。任务管理器告诉我,在运行的几秒钟内,内存使用量将增加到总系统RAM的60%。 我使用英特尔检查器来了解内存泄漏。我原以为我会得到一个创建问题的功能列表。但我得到的只是dll,如下面的截图所示。
该应用程序正在使用几个第三方库,例如以Pv,OpenCv cdio,CAIO等开头的那些库。正如您所看到的,最后一个是opencv库,占用接近400MB。 (这怎么可能?)
右侧面板还显示已发生的不同类型的泄漏。
我想确定内存泄漏代码并更正它。我的策略应该是什么,我应该开始研究哪些功能?为什么检查员没有给我正确的源代码而只是给我一些dll?我确信dll是完美的,因为这些被数百万人使用。
请指教, 谢谢
更新
我认为在生成exe时我在各种编译器设置中做错了。 。
如上所示,没有加载符号信息。这就是我无法获得内存泄漏发生的源代码的原因。按F1键可以看到以下说明:
排除无符号信息症状 在“源”窗口中,英特尔检查器不会显示问题集中任何代码位置的源代码。
详细信息除非应用程序具有可用符号,否则Intel Inspector无法显示用于查看和编辑的源代码。
如果英特尔检查器未检测到某个位置的符号,则会将调用堆栈和代码窗格设置为可以找到符号的第一个位置。
如果英特尔检查器无法在带有符号的调用堆栈中找到任何位置,则会提供该位置的模块名称和相对虚拟地址(RVA)。
可能的更正策略
1-在Windows *系统上编译和链接应用程序时:
a)启用调试信息编译器选项。
b)设置链接器选项以生成调试信息。
2-配置项目以搜索非标准目录。
3-将符号文件(例如* .pdb文件)复制到Intel Inspector可以找到它们的位置。
所以现在我专注于上述纠正策略。我的最新问题是:
1-如何在MSVS 2010中设置以上三种策略。 2-使用英特尔检查员时,是否需要使用debgug exe或release exe?
答案 0 :(得分:1)
如果这是您的源代码,并且您确定代码导致泄漏,则可以使用Visual Leak Detector。
你只需要在项目中进行非常小的改动 - 我只想说#include<vld.h>
(你可以作为条件)。它将报告Debug Output窗口中的所有内存泄漏。这不同于VC ++标准泄漏的静态 - 它显示内存分配的位置。
答案 1 :(得分:1)
从某种程度上说,它无法为某些模块/模块加载符号,因此信息有点不正确。符号文件(如opencv_core240.pdb)是否可以使用opencv_core240.dll?检查一下!
另外,我建议尝试使用另一个内存泄漏检测器来比较它们的结果。
答案 2 :(得分:0)
通常,在使用Inspector时,建议使用代码的调试版本。发布版本可以优化掉一些重要的代码片段。
您还可以在发布版本中启用仅调试符号,这在使用Amplifier和Advisor时非常重要。您可以通过转到Project - &gt;来完成此操作。 [项目名称]属性... - &gt;链接器 - &gt;调试 - &gt;生成调试信息 - &gt;是和项目 - &gt; [项目名称]属性...-&gt; C / C ++ - &gt;一般 - &gt;调试信息格式 - &gt;程序数据库。即使您处于调试配置中,也要确保正确设置这些设置,因为它们可能已被意外修改。
WRT您在报告中看到的内容: OpenCV(和其他人)不占用350MB,而是存在泄漏的大小(这意味着动态分配的内存的最后一个指针被覆盖而不释放该内存)。您是否有可能滥用库API?
此外,您可能会发现在泄漏位置查看调用堆栈很有用。您可能会发现导致内存泄漏的API,这可以帮助您查明问题。