2013-12-18 47 views
-2

原諒我可憐的英語。無法在vs2012中輸出調試信息

我要檢查內存泄漏:

_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); 

這也可以很好地工作。微軟給出的連接

+0

你正在使用哪種編程語言?請提供一個簡單的主函數和您在程序中使用的內存分配以及您設置泄漏檢測的方式。感謝您提供任何幫助。 – Ursegor

+0

@Richard首先,語言是C++,我用_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF)設置泄漏檢測;' 我甚至嘗試了'int * pData = new int [100];''不能工作。 但是當我調試時,'_CrtDumpMemoryLeaks()'已經真正執行。 – wangxt

回答

0

解決方法:如果你有Visual Studio的選項

的Debug.WriteLine電話可能無法在輸出窗口中顯示「重定向所有輸出窗口的文本即時窗口」下的

檢查菜單工具>選項>調試>常規。要顯示「工具>選項>調試」,請選中「工具>選項>顯示所有設置」旁邊的複選框。

+0

我試過之前,無論是檢查或取消選中該選項,它都無法工作。 – wangxt

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 

如果從示例註釋掉分配,你不會得到在輸出窗口的調試窗格中的任何結果。

否則我得到的輸出如下:

檢測內存泄漏! 轉儲對象 - > c:\ users [用戶] \ documents \ visual studio 2012 \ projects \ leak \ main.cpp(23):{78} 0x003E8A50正常區塊,20個字節長。
CD:CD CD CD CD CD CD CD CD
c:\ users [user] \ documents \ visual studio 2012 \ projects \ leak \ main.cpp(21):{ 77}正常的塊在0x003E9F80,20個字節長。
數據:<> CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
對象轉儲完成。

也有是當你在return語句之前刪除分配的內存沒有輸出:

free(myArrayCAlloc); 
    delete[] myArrayCppAlloc; 

正如你指出:

當我調試,_CrtDumpMemoryLeaks()已忠實地執行

在文檔中:

如果您的應用程序沒有定義_CRTDBG_MAP_ALLOC,_CrtDumpMemoryLeaks會顯示內存泄漏報告

所以你需要使用_CRTDBG_MAP_ALLOC如果你想使用_CrtSetDbgFlag,但是這似乎是的一個間接後果參考。

+0

謝謝@Richard,'_CRTDBG_MODE_FILE'可以工作,所以我認爲我的泄漏檢查設置是好的,我檢查了你的答案,我做了你所說的一切。 – wangxt

0

請檢查

  • 是您的解決方案設置爲運行調試版本?
  • 是您的調試配置集來建立一個調試版本或發佈版本?檢查菜單Build/Configuration manager...。您的解決方案可能被設置爲調試模式,但仍然會在發佈模式下構建一些項目。

Screenshot of Debug configuration building reease mode project

+0

謝謝@Thomas,它的解決方案是調試模式,每個子項目都以構建模式構建。 – wangxt

+0

如果您的問題解決了,請您接受答案?謝謝。 –

+0

當前未解決。我想我可以嘗試重新安裝與 – wangxt

2

你設法讓VS調試器進入它沒有顯示調試輸出模式,()這是由OutputDebugString的產生的那種。將輸出重定向到立即窗口被覆蓋,所以不能這樣做。

真的只有一個候選人離開了。右鍵單擊輸出窗口,並確保選中「程序輸出」選項。這一個:

enter image description here

+0

謝謝@Hans,也許你是對的,該選項未被選中,所以我檢查了它,但它仍然沒有打印任何東西。任何其他幫助? – wangxt

+0

查看未選中的選項是99.999%的解釋。你必須在其他地方尋找另外的0.001%:) –