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;