繁体   English   中英

试图找出 dll 内存泄漏的来源

[英]trying to figure out the source of memory leak from dlls

我们的应用程序之一(Windows 窗体应用程序 C++、MSVS 2010)在使用几分钟后崩溃。 任务管理器告诉在运行的短短几秒钟内,内存使用量就增长到总系统 RAM 的 60%。 我使用英特尔检查器来了解内存泄漏。 我期待我会得到一个创建问题的函数列表。 但我得到的只是 dll,如下面的屏幕截图所示。

在此处输入图片说明

该应用程序使用了一些第三方库,例如以 Pv、OpenCv cdio、CAIO 等开头的库。如您所见,最后一个是 opencv 库,占用的空间接近 400MB。 (这怎么可能 ? )

右侧面板还显示了已发生的不同类型的泄漏。

我想指出内存泄漏代码并纠正它。 我的策略应该是什么,我应该开始研究哪些功能? 为什么检查员不给我正确的源代码而只给我 dll? 我确信 dll 是完美的,因为它们被数百万人使用。

请指教,谢谢

更新

我想我在生成 exe 时在各种编译器设置中做错了。在此处输入图片说明 .

如上所示,没有加载符号信息。 这就是我无法获得发生内存泄漏的源代码的原因。 按 F1 让我看到以下说明:


对无符号信息症状进行故障排除在“源”窗口中,英特尔 Inspector 不显示问题集中任何代码位置的源代码。

详细信息 Intel Inspector 无法显示用于查看和编辑的源代码,除非应用程序具有可用符号。

如果英特尔 Inspector 未检测到某个位置的符号,则会将调用堆栈和代码窗格设置为可以找到符号的第一个位置。

如果 Intel Inspector 在调用堆栈中找不到任何带有符号的位置,它会提供该位置的模块名称和相对虚拟地址 (RVA)。

可能的纠正策略
1- 当您在 Windows* 系统上编译和链接应用程序时:

a) 启用调试信息编译器选项。

b) 设置链接器选项以生成调试信息。

2- 配置项目以搜索非标准目录。

3- 将符号文件(例如 *.pdb 文件)复制到 Intel Inspector 可以找到它们的位置。


所以现在我专注于上述修正策略。 我最近的问题是:

1- 如何在 MSVS 2010 中设置上述三种策略。 2- 使用 Intel 检查器时是否需要使用 debgug exe 或 release exe?

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

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

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

另外我建议尝试另一个内存泄漏检测器来比较它们的结果。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM