【问题标题】:trying to figure out the source of memory leak from dlls试图从 dll 中找出内存泄漏的来源
【发布时间】: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


【解决方案1】:

如果这是您的源代码,并且您确定是您的代码导致了泄漏,您可以使用Visual Leak Detector

您只需要对项目进行非常小的更改 - 我会说只是 #include<vld.h>(您可以设置条件)。它将报告调试输出窗口上的所有内存泄漏。这不同于 VC++ 标准泄漏静态信息 - 它显示了内存分配的位置

【讨论】:

  • 我已经更新了我的问题,您能否根据此更新提出一些建议?
【解决方案2】:

可能它无法为某些模块/模块加载符号,因此信息有点不正确。符号文件(如 opencv_core240.pdb)opencv_core240.dll 是否可用?检查一下!

另外我建议尝试使用其他内存泄漏检测器来比较它们的结果。

【讨论】:

  • 感谢您的信息。我想你是对的。你能看到我上面更新的部分并回答我的最新问题吗?
【解决方案3】:

通常,在使用 Inspector 时,建议使用代码的调试版本。发布版本可能会优化掉一些重要的代码。

您还可以在发布版本中仅启用调试符号,这在使用 Amplifier 和 Advisor 时很重要。您可以通过转到 Project -> [project name] properties... -> Linker -> Debugging -> Generate Debug Info -> Yes 和 Project->[project name] properties...->C/C++- 来执行此操作>常规->调试信息格式->程序数据库。即使您处于调试配置中,也要确保这些设置设置正确,因为它们可能已被意外修改。

WRT 您在报告中看到的内容: OpenCV(和其他)不占用 350MB,而是存在该大小的泄漏(这意味着最后一个指向动态分配内存的指针被覆盖而没有释放该内存)。您是否可能误用了库 API?

此外,您可能会发现查看泄漏位置的调用堆栈很有用。您可能会发现导致内存泄漏的 API 可以帮助您查明问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-30
    • 1970-01-01
    • 2012-06-16
    • 2021-08-14
    • 1970-01-01
    相关资源
    最近更新 更多