为什么_CrtSetBreakAlloc不会导致断点?

时间:2010-02-09 00:35:28

标签: memory-leaks visual-c++ msvcrt crtdbg.h

我正在使用来自<crtdbg.h>的Visual CRT的内存泄漏检测例程;当我调用_CrtDumpMemoryLeaks时,在每次调用程序时都会一致地报告一个分配:

{133} normal block at 0x04F85628, 56 bytes long.
 Data: <                > B0 81 F8 04 B0 81 F8 04 B0 81 F8 04 CD CD CD CD 

地址有所不同,但{133}始终相同。

根据MSDN关于How to set breakpoints on memory allocation number的说明,我应该可以通过此调用在第133次分配上设置断点:

_CrtSetBreakAlloc(133);

我还可以在监视窗口中验证{,,msvcr90d.dll}_crtBreakAlloc确实设置为133.程序退出后,泄漏报告仍会列出#133(以及一些更高的数字),但不会发生断点。为什么会这样,我如何让断点发生?

潜在相关信息:

  1. VS2008,使用“多线程调试DLL”CRT
  2. 我的代码是由第三方产品加载的DLL
  3. “正常”断点工作正常;踩踏工作正常; __asm int 3也可以。
  4. _crtBreakAlloc没有其他值也会导致断点(不是我试过的那个)
  5. 133是泄漏报告中的最低编号

2 个答案:

答案 0 :(得分:9)

主要额头拍打......一个“显而易见”的原因是,在设置断点之前,如果分配#133发生了 ...

只是在我的DLL被调用之前发生了第一次泄漏。事实上,它不一定是泄漏,因为我在卸载DLL时调用_CrtDumpMemoryLeaks - 而不是在父应用程序完成取消初始化时。

至于我原来的问题中的“潜在相关信息#4” - 我确实尝试了一些值,但不知何故没有高于133 ......

答案 1 :(得分:0)

听起来您可能正在使用非调试库编译您的应用程序,例如。如果您使用应该破坏您的应用程序的lib的发行版本,它将不会这样做。这可能是因为您使用第三方应用程序。也可能在运行时加载非调试dll代替调试版。

尝试在调试时查看是否为您的应用加载了正确的DLL-s以及实际调试了应用程序或DLL。 (有时您必须明确地将dll或exe加载到调试器中。)

这是我能想到的所有内容,而没有看到更多关于此的细节...