天天看點

如何調試MFC中的記憶體洩漏

    首先,應該是MFC報告我們發現記憶體洩漏。注意:要多運作幾次,以确定輸出的内容不變,特别是{}之間的數值,不能變,否則下面的方法就不好用了。

如何調試MFC中的記憶體洩漏

      我們來看看:

F:/CodeSample/Test/TestPipe/LeakTest/MainFrm.cpp( 54 ) : { 86 } normal block at  0x00422E80 ,  10  bytes  long .

 Data:  <            >  1F 1F 1F 1F 1F CD CD CD CD CD 

         F:/CodeSample/Test/TestPipe/LeakTest/MainFrm.cpp( 54 ) 告訴我們MFC認為是在該檔案的54行,發生了記憶體洩漏。你輕按兩下改行就可以轉到該檔案的54行了。但是有時候這一資訊并不能用來準确判斷,比如:MFC可 能報告Strcore.cpp檔案的某行,實際上這是CString的實作函數,此時并不知道什麼時候發生了記憶體洩漏。

         此時我們需要更多的資訊。那麼我們看看緊接其後的:

{ 86 } normal block at  0x00422E80 ,  10  bytes  long .

         它告訴我們:在第86次配置設定的記憶體沒有釋放,一共有10位元組,内容移16進制方式列印給我們看。

         有了這些資訊,我們可以開始調試記憶體洩漏了。

         按下F10在程式的剛開始處,停下來,打開Watch視窗:

如何調試MFC中的記憶體洩漏

    在Watch視窗中輸入:

{,,msvcrtd.dll}_crtBreakAlloc

如何調試MFC中的記憶體洩漏

 然後更改值為上文提到的配置設定次數:86

如何調試MFC中的記憶體洩漏

接着按下F5繼續,然後在第86次配置設定的時候會發生中斷:

如何調試MFC中的記憶體洩漏

  然後我們打開堆棧視窗:

如何調試MFC中的記憶體洩漏

往回檢視最近我們自己的代碼,輕按兩下堆棧我們自己的函數那一層,上圖有綠色三角的那一層。就定位到洩漏時配置設定的記憶體了。

如何調試MFC中的記憶體洩漏

From: http://www.cnitblog.com/Raistlin/archive/2005/12/14/5380.html

靜态:_crtBreakAlloc

動态:{,,msvcr40d.dll}*__p__crtBreakAlloc()  (vc++4.0 和4.1版本,估計沒人在用吧)

         {,,msvcrtd.dll}*__p__crtBreakAlloc()  (Visual C++ 4.2 or later)

         {,,msvcrtd.dll}_crtBreakAlloc (好像這樣也是可以的)

{,,msvcrtd.dll}__p__crtBreakAlloc()是個什麼東西呢?

檢視msdn索引“Advanced Breakpoint”and you will find out...

文法如下:

{[function],[source],[exe] } location

{[function],[source],[exe] } variable_name

{[function],[source],[exe] } expression

繼續閱讀