【发布时间】:2015-07-04 08:43:14
【问题描述】:
我们的一个应用程序(Windows 窗体应用程序 C++,MSVS 2010)在使用几分钟后崩溃。任务管理器告诉内存使用量在运行的几秒钟内增长到总系统 RAM 的 60%。 我使用英特尔检查器来了解内存泄漏。我期待我会得到一个产生问题的函数列表。但我得到的只是如下截图所示的 dll。
该应用程序使用了几个第三方库,例如以 Pv、OpenCv cdio、CAIO 等开头的库。如您所见,最后一个是 opencv 库,占用接近 400MB。 (这怎么可能?)
右侧面板还显示已发生的不同类型的泄漏。
我想查明内存泄漏代码并纠正它。我的策略应该是什么,我应该开始研究哪些功能?为什么检查员没有给我正确的源代码而只是给我 dll?我确信 dll 是完美的,因为它们已被数百万人使用。
请指教, 谢谢
更新
我认为我在生成 exe 时在各种编译器设置中做错了。 .
从上面可以看出,没有加载任何符号信息。这就是我无法获得发生内存泄漏的源代码的原因。按 F1 可以看到以下说明:
排除无符号信息症状 在 Sources 窗口中,Intel Inspector 不显示问题集中任何代码位置的源代码。
详细信息 Intel Inspector 无法显示源代码以供查看和编辑,除非应用程序具有可用符号。
如果 Intel Inspector 没有检测到某个位置的符号,它会将调用堆栈和代码窗格设置为它可以找到符号的第一个位置。
如果 Intel Inspector 在调用堆栈中找不到任何带有符号的位置,它会提供该位置的模块名称和相对虚拟地址 (RVA)。
可能的修正策略
1- 在 Windows* 系统上编译和链接应用程序时:
a) 启用调试信息编译器选项。
b) 设置链接器选项以生成调试信息。
2- 配置项目以搜索非标准目录。
3- 将符号文件(例如 *.pdb 文件)复制到 Intel Inspector 可以找到它们的位置。
所以现在我专注于上述修正策略。我最近的问题是:
1-我如何在MSVS 2010中设置以上三个策略。 2- 使用 Intel 检查器时需要使用 debgug exe 还是 release exe?
【问题讨论】:
标签: c++ visual-studio opencv dll memory-leaks