2011-09-20 107 views
1

我一直工作在C++项目有一段时间了,现在在VS 2008直到最近,在终止时我的应用程序的输出窗口将显示如果我有任何内存泄漏。但是,几天前我发现它停止显示这些有价值的信息。我也尝试过扔一些printf(),但输出窗口没有显示出来。Visual Studio 2008中的输出窗口停止工作

我猜我的地方改变的偏爱,但我似乎无法找到它。现在所有输出显示的是它加载/卸载哪个dll。有任何想法吗?

感谢, 麦克

+0

您确定输出窗口未设置为显示构建输出,而不是调试输出? –

+0

是的,它肯定设置为“显示调试输出” – mike

+0

一位同事在VS 2008 C++中遇到了同样的问题。它在一周前“固定了自己”,我们不知道如何修正它。他得到了所有的调试输出(例如符号加载,跟踪等),而不是由dbg_heap例程输出的任何内存泄漏。只是想让你知道你并不是想象的东西。 – franji1

回答

0

从我自己的经验来看,内存泄漏输出失踪可能是由于不同的原因。总结最重要的:

  1. 变化的源代码:

    • 禁用内存泄漏报告(即使用_CrtSetDbgFlag
    • 安装自定义报告挂钩(见_CrtSetReportHook,_CrtSetReportHook2
    • 将输出重定向到一个文件(请参阅CrtSetReportMode
    • 源代码中导致ap上无声“崩溃”的更改折叠终止 - 应用默默终止没有达到在内存泄漏报告点前的问题的任何迹象(如不可能这似乎我有这个一次)。
  2. 开发环境中的设置导致输出被重定向到另一个窗口。一种可能性是:工具\选项\调试\一般\重定向所有输出窗口的文本即时窗口(第5次从底部)。这里可能存在其他可能性。

我想一种可能性,以排除点2是创建在的行的简单的控制台应用程序(main.cpp中):

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

#ifndef DEBUG_NEW 
#define DEBUG_NEW new(_NORMAL_BLOCK, __FILE__, __LINE__) 
#define new DEBUG_NEW 
#endif 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int nOldState = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); 
    _CrtSetDbgFlag(nOldState | _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 

    int *pInt = new int[100]; 
    return 0; 
} 

如果运行此应用程序正确地输出内存泄漏然后不幸的是,你很可能的情况下,1

当然,我排除了明显的事情,为什么输出能够消失(其中一些在评论中已经提到)。

+0

感谢信息ds27680。我运行了你发布的示例程序,它确实输出了泄漏,所以我想这不是一个Visual Studio的问题。你提到在打印调试信息之前,我的应用程序可能正在退出。你有关于如何发生的更多信息?此外,如果它有所作为,我正在写一个directx应用程序,而不是控制台应用程序。 – mike

+0

@mike那么调试这个最好的方法就是在CRT源中放置一个断点(即一个好的地方是crtlib。c。在__CRTDLL_INIT功能的 “否则,如果(dwReason == DLL_PROCESS_DETACH){” 分支,正确的#ifdef _DEBUG前 /*转储所有的内存泄漏*/ 如果(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)_CRTDBG_LEAK_CHECK_DF) { _CrtSetDumpClient(NULL ); __freeCrtMemory(); _CrtDumpMemoryLeaks(); } #endif/* _DEBUG */ – ds27680

+0

@mike从该断点调试下来并输入_CrtDumpMemoryLeaks(); (如果函数被调用)。如果不是,那么这可能意味着某些代码会在某处取消_CRTDBG_LEAK_CHECK_DF标志。 – ds27680

相关问题