使用_crtBreakAlloc查找内存泄漏 - 标识符“_crtBreakAlloc”未识别

时间:2015-05-20 18:46:49

标签: c memory-leaks crt

我正在按照this链接中的建议在Watch窗口中使用_crtBreakAlloc,但是值行显示“标识符”_crtBreakAlloc“未识别”并且它根本不起作用。

我做错了什么?我顺便使用Visual Studio。

代码示例:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

#include <malloc.h>


int main()
{
    int *arr = (int*)malloc(10 * sizeof(int)); //breakpoint here
    free(arr);
    return 0;
}

然后我将_crtBreakAlloc写入Watch窗口的Name字段,并在遇到断点时按Enter键。

5 个答案:

答案 0 :(得分:2)

_crtBreakAlloc是VS2015下的一个宏,它被一个函数调用替换为返回指向int的指针。在监视窗口中跟踪变量似乎不是一种选择 更好地插入您的(调试)代码,如下所示:

_crtBreakAlloc = 18;

答案 1 :(得分:2)

几个选项:
-添加 {,, ucrtbased.dll} _crtBreakAlloc 作为要观看的变量
这要求在顺序观察窗口中加载符号才能正确显示变量类型

找出您要针对哪个CRT版本 crt * .dll 。 (新的ucrtbase d .dll,旧的msvcrt d * .dll等)
https://docs.microsoft.com/en-us/cpp/c-runtime-library/crt-library-features?view=vs-2019
加载所有模块,或手动添加到\ tools \ options \ debug \ symbols \仅加载规范模块
注意:您的调试配置使用/ MD d 进行编译(将定义_DEBUG)
发布配置使用/ MD(大多数调试宏仅为零;)


-使用 memchk_break 宏作为波纹管,它将在本地自动显示分配块
(因为它是通过编译解决的)


-让它运行,传递第一个中断,让它打印内存泄漏(如果有)
-在第二轮中,将alloc块键入变量,运行并捕获


#ifdef _DEBUG
   #define memchk_break() { auto& _ab = _crtBreakAlloc; __debugbreak(); }
#else
   #define memchk_break() 0;
#endif
void main(){
   memchk_break();
   // your code
   _CrtDumpMemoryLeaks();
}

答案 2 :(得分:1)

如果您使用的是CRT的多线程版本,请在中输入以下内容 观察窗口(列名):

(int*){,,ucrtbased.dll}_crtBreakAlloc

然后按Enter键并将值-1更改为导致用户定义断点的新分配编号。

enter image description here

答案 3 :(得分:1)

{,,ucrtbased.dll}*__p__crtBreakAlloc()

适用于Visual Studio 2017

答案 4 :(得分:1)

如果未加载ucrtbased.dll符号,则

_crtBreakAlloc将报告为不确定。我遇到了这个问题,因为我没有自动加载我的符号。您可以进入模块列表并手动为ucrtbased.dll加载符号,然后_crtBreakAlloc应该会显示并正常工作。