无法在vs2012中输出调试信息

时间:2013-12-18 02:25:26

标签: 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);

当程序退出时,我在vs2012的调试输出面板中看不到任何输出。

然后我进入_CrtDumpMemoryLeaks()并发现内存泄漏,泄漏检查结果正确,但无法打印出来。

所以我试过了:

OutputDebugStringA("Output string");

VS仍然没有打印任何内容。

我试过 DebugView ,一切运行正常,但很麻烦。

AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", "w", stdout);
freopen("CONOUT$", "w", stderr);

这也可以很好用。

4 个答案:

答案 0 :(得分:2)

你以某种方式让VS调试器进入了一个不显示调试输出的模式,这是由OutputDebugString()生成的。将输出重定向到立即窗口已被覆盖,因此不可能。

实际上只剩下一名候选人了。右键单击“输出”窗口,确保勾选“程序输出”选项。这一个:

enter image description here

答案 1 :(得分:0)

Microsoft Connect提供的解决方案:

如果在

下选中Visual Studio选项“将所有输出窗口文本重定向到立即窗口”,则调试可能不会在输出窗口中显示调试.WriteLine调用

菜单工具>选项>调试>一般。要显示“工具>选项>调试”,请选中“工具>选项>显示所有设置”旁边的框。

答案 2 :(得分:0)

一个简短的例子:

#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;
}

我认为它运作正常。

使用文档herehere

  

此映射仅在调试版本中发生。

  

但是,如果您的程序使用C ++ new运算符分配内存,则需要重新定义新内存。

通过以下内容:

 #ifdef _DEBUG
     #ifndef DBG_NEW
         #define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
         #define new DBG_NEW
     #endif
 #endif  // _DEBUG

如果您注释掉示例中的分配,则不会在“输出”窗口的“调试”窗格中获得任何结果。

否则我得到了以下输出:

  

检测到内存泄漏!   转储对象 - &gt;   c:\ users [user] \ documents \ visual studio 2012 \ projects \ leak \ main.cpp(23):{78}正常块位于0x003E8A50,长度为20个字节。
  数据:&lt; &GT; CD光盘CD光盘CD光盘CD光盘CD光盘CD光盘CD光盘CD
  c:\ users [user] \ documents \ visual studio 2012 \ projects \ leak \ main.cpp(21):{77}正常块位于0x003E9F80,长度为20个字节。
  数据:&lt; &GT; CD光盘CD光盘CD光盘CD光盘CD光盘CD光盘CD光盘CD
  对象转储完成。

return语句之前删除已分配的内存时,也没有输出:

  free(myArrayCAlloc);
  delete[] myArrayCppAlloc;

正如你所指出的那样:

  

当我调试时,_CrtDumpMemoryLeaks()已经真正执行

在文档中:

  

如果您的应用程序未定义_CRTDBG_MAP_ALLOC,_CrtDumpMemoryLeaks将显示内存泄漏报告

因此,如果您想使用_CRTDBG_MAP_ALLOC,则需要使用_CrtSetDbgFlag,但这似乎是参考的间接后果。

答案 3 :(得分:0)

请检查

  • 是您运行Debug build的解决方案吗?
  • 是您的Debug配置集,用于构建Debug构建版本还是发布版本?检查菜单Build / Configuration manager...。您的解决方案可能已设置为“调试”模式,但仍会在发布模式下构建一些项目。

Screenshot of Debug configuration building reease mode project