【问题标题】:CRT not detecting memory leak in DLLCRT 未检测到 DLL 中的内存泄漏
【发布时间】:2018-04-04 06:25:24
【问题描述】:

我开发了一个由主要可执行文件和动态库 (dll) 组成的应用程序。它们都是由我开发的,并且在 Windows 10 Pro 上使用相同的编译器(仅供参考:两者都包含在相同的 VS 解决方案中)构建。

当我想使用MS CRT 库测试可执行文件和库是否存在内存泄漏时。我可以检测到可执行文件中的内存泄漏,但不能检测动态库中的内存泄漏(我故意用一个未删除的整数泄漏两者)。

可执行文件是用 MDd 构建的,而库是用 MTd 构建的。我还尝试使用 MTd 构建可执行文件,但没有成功。 (由于其依赖关系,库必须使用 MT(d) 构建)。另外请注意,我并不是说我有较小的内存泄漏报告(比如没有文件名和行),我的意思是至少应该有一个 dll 报告时没有报告。

问题是是否有人遇到过这个问题并且知道如何解决它。

【问题讨论】:

  • 更好地使用 Dr Memory:drmemory.org。与已知会在内存泄漏上给出误报的 MS CRT 库不同,我发现 Dr Memory 也更加准确和信息丰富
  • 感谢您的建议,我实际上尝试过使用它,但由于windows版本错误而关闭(我在问题中添加了开发操作系统)。
  • 仅供参考,它与 Windows 10 兼容
  • 由于静态链接到 CRT,DLL 有自己的副本,因此也有自己的堆。您可以尝试在进程分离时在 DllMain 中调用 _CrtDumpMemoryLeaks。
  • 与其编辑问题以添加解决方案,不如将其发布为答案! Answering your own question is not forbidden,但officially encouraged。 (甚至可以选择直接在Ask a Question 页面回答问题)

标签: c++ c++11 visual-c++ memory-leaks crt


【解决方案1】:

Johannes Passing 在他的博客文章中提到,当 DLL 链接到 CRT 的静态版本时,进行显式内存转储的正确位置是 DllMain 的 DLL_PROCESS_DETACH 案例。

https://jpassing.com/2008/09/01/effective-leak-detection-with-the-debug-crt-and-application-verifier/

【讨论】:

  • 谢谢,我在 dll 条目上添加了 crt 标志设置(实际上不是 DllMain,但对于我的用例来说几乎相同),我得到了丢失的泄漏。
【解决方案2】:

您的 DLL 不使用 MFC?然后是问题,MFC 中的内存泄漏检测通过自己的分配器覆盖本机 C++ new,并使用 Microsoft 文档中提到的宏。恐怕你必须在 .LL 中重新实现跟踪方法,如果它不使用它.. 带有 _CRTDBG_MAP_ALLOC 的 crt lib 跟踪 malloc,不会触及原生 operator new

【讨论】:

  • 据我所知,没有使用 MFC,尽管我在库中出于某些目的使用 CEF 和本机窗口。
猜你喜欢
  • 2012-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2012-01-22
  • 1970-01-01
  • 2021-09-01
相关资源
最近更新 更多