【问题标题】:_CrtSetAllocHook never shows filename/line number_CrtSetAllocHook 从不显示文件名/行号
【发布时间】:2010-11-14 11:34:13
【问题描述】:

我在我的应用程序中实现了一个内存跟踪器,这样如果我得到任何内存泄漏,我可以打开这个小家伙来找到它。

一切都很好,只是我从未传递过文件名或行号。我必须使用_CrtSetDbgFlag 或预处理器命令设置一些标志吗?

在我运行这个东西(基本)之后,它显示了 26 个未清理的分配,我很确定它们不是我,但不知道它们发生在哪里。

提前致谢!

【问题讨论】:

  • 您是否考虑过使用vld 而不是自己滚动?
  • @Space_C0wb0y,感谢您提供的链接,我会检查一下。但这也是一个了解 CRT 调试功能的练习(我希望也能尽快捕获堆栈),并在某种程度上“深入了解”:)

标签: c++ debugging visual-c++ crt visual-studio-debugging


【解决方案1】:

来自<crtdbg.h> 头文件:

#ifdef  _CRTDBG_MAP_ALLOC
#define   malloc(s)             _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
// etc...
#endif

请注意,现在重新定义如何调用具有您要查找的文件和行号的另一个版本的 malloc。显然,要完成这项工作,您必须#define _CRTDBG_MAP_ALLOC 和#include crtdb.h。这最好在您的预编译头文件中完成,这样您就可以合理地确定您的所有代码都将使用这些有效的宏进行编译。

这仍然不能保证你会得到这些信息。您的项目可能正在使用在没有它的情况下编译的 .lib。另一种故障模式是在您生成泄漏报告之前可能会卸载 DLL。该 DLL 的文件和行信息也将被卸载。

有一个备用方法可以诊断出这类麻烦制造者。泄漏报告有一行以块号开头的泄漏行,显示在花括号内的开头。只要该块号在两次运行之间保持稳定,您就可以在分配时强制调试器中断。将此代码放入您的 main 方法或代码中早期执行的任何位置:

 _crtBreakAlloc = 42;   // Change the number

【讨论】:

  • 您好,感谢您的回复。我实现了宏并将您在上面概述的包含在我的核心头文件中(它被预编译),但仍然没有一个文件名被传递(我使用断点检查)。还有什么我可能会丢失的吗? (也感谢您的知情回复)
  • 注意:在调试器中我看到它仍在进行常规的 malloc 调用。
  • 嗯,这就解释了。为什么它不使用重新定义从我所在的位置无法猜测。仔细检查 _CRTDBG_MAP_ALLOC 是否为#defined,并通过查看预处理器输出来解决预处理器的问题。
  • 我知道你坐在那里一定很难 :) 在我的核心头文件中,我 #define _CRTDBG_MAP_ALLOC (我仔细检查了拼写,甚至复制了 <crtdbg.h> 的定义)然后直接在后面包含<crtdbg.h>。无论如何,我会看看我能做什么,你的答案是正确的,所以应该这样标记:) 谢谢你的时间。
猜你喜欢
  • 1970-01-01
  • 2020-04-01
  • 2016-11-17
  • 2021-12-22
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 2016-04-05
  • 2018-08-05
相关资源
最近更新 更多