Visual studio 2012 Can';t在vs2012中输出调试信息
请原谅我的英语不好 我要检查内存泄漏:Visual studio 2012 Can';t在vs2012中输出调试信息,visual-studio-2012,memory-leaks,Visual Studio 2012,Memory Leaks,请原谅我的英语不好 我要检查内存泄漏: _CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG); _CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG); _CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG); _CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 当程序退出时,我在vs20
_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_DEBUG);
_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_DEBUG);
_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_DEBUG);
_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
当程序退出时,我在vs2012的调试输出面板中看不到任何输出
然后我进入_crtdumpmomeryleaks(),发现内存泄漏,泄漏检查结果是正确的,但无法打印出来
所以我试着:
OutputDebugStringA("Output string");
VS仍然不打印任何内容
我尝试了DebugView,一切正常,但很麻烦
AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);
这也很有效。Microsoft Connect提供的解决方案: 如果在下选中Visual Studio选项“将所有输出窗口文本重定向到即时窗口”,则Debug.WriteLine调用可能不会显示在输出窗口中 菜单工具>选项>调试>常规。要显示“工具>选项>调试”,请选中“工具>选项>显示所有设置”旁边的框。一个简短示例:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
/*Your includes*/
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG
#define SIZE 5
int main()
{
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
int* myArrayCAlloc = (int*)malloc(sizeof(int) * SIZE);
int* myArrayCppAlloc = new int[SIZE];
return 0;
}
如果注释掉示例中的分配,则在“输出”窗口的“调试”窗格上不会得到任何结果
否则,我将获得以下输出:
检测到内存泄漏!
转储对象->
c:\users[user]\documents\visual studio 2012\projects\leak\main.cpp(23):{78}0x003E8A50处的普通块,20字节长。数据:<>CD CD
c:\users[user]\documents\visual studio 2012\projects\leak\main.cpp(21):{77}0x003E9F80处的普通块,20字节长。
数据:<>CD CD
对象转储完成 在
return
语句之前删除分配的内存时,也没有输出:
free(myArrayCAlloc);
delete[] myArrayCppAlloc;
正如你所指出的:
调试时,_CrtDumpMemoryLeaks()已真正执行
在文件中:
如果应用程序未定义_CRTDBG_MAP_ALLOC,_crtdumpmomerylaks将显示内存泄漏报告
因此,如果您想使用\u crtsetdbglag
,您需要使用\u CRTDBG\u MAP\u ALLOC,但这似乎是引用的间接结果。请检查
- 您的解决方案是否设置为运行调试生成
- 您的调试配置设置为生成调试版本还是发布版本?签入菜单
生成/配置管理器…
。您的解决方案可能设置为调试模式,但仍以发布模式构建一些项目
您以某种方式使VS调试器进入了一种模式,在这种模式下,它不显示调试输出,即OutputDebugString()生成的那种。将输出重定向到即时窗口的操作已被覆盖,因此无法执行
实际上只剩下一个候选人了。右键单击输出窗口并确保勾选了“程序输出”选项。这个:
您确切使用哪种编程语言?请提供一个简单的主函数示例,以及您在程序中使用的内存分配,以及设置泄漏检测的方式。谢谢您提供的任何帮助。@ Richard First,语言是C++,我用“代码”设置泄漏检测。代码>我甚至尝试了int*pData=newint[100]代码>无法工作。但是当我调试的时候,\u crtdumpmomeryleaks()
确实执行了。我以前试过。无论是否选中该选项,它都无法工作。谢谢@Richard,\u CRTDBG\u MODE\u文件
可以工作,所以我认为我的泄漏检查设置正常,我检查了你的答案,我做了你说的一切。谢谢@Thomas,解决方案是调试模式,每个子项目都是构建模式。如果您的问题得到解决,请接受答案?谢谢,目前还没有解决。我想我可以尝试重新安装vs。谢谢@Hans,也许你是对的,选项未选中,所以我选中了它,但它仍然没有打印任何内容。还有其他帮助吗?查看未选中的选项可以解释99.999%。您必须在其他位置查找其他0.001%:)
free(myArrayCAlloc);
delete[] myArrayCppAlloc;