如何除錯MFC中的記憶體洩漏

2021-08-30 22:56:20 字數 1505 閱讀 2165

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

我們來看看:

f:\codesample\test\testpipe\leaktest\mainfrm.cpp(

54):normalblockat

0x00422e80 ,

10bytes

long .

data:

<

>

1f1f1f1f1fcdcdcdcdcd

f:\codesample\test\testpipe\leaktest\mainfrm.cpp(

54) 告訴我們mfc認為是在該檔案的54行,發生了記憶體洩漏。你雙擊改行就可以轉到該檔案的54行了。但是有時候這一資訊並不能用來準確判斷,比如:mfc可 能報告strcore.cpp檔案的某行,實際上這是cstring的實現函式,此時並不知道什麼時候發生了記憶體洩漏。

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

normalblockat

0x00422e80 ,

10bytes

long .

data:

<

>

1f1f1f1f1fcdcdcdcdcd

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

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

按下f10在程式的剛開始處,停下來,開啟watch視窗:

在watch視窗中輸入:

_crtbreakalloc

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

接著按下f5繼續,然後在第86次分配的時候會發生中斷:

然後我們開啟堆疊視窗:

往回檢視最近我們自己的**,雙擊堆疊我們自己的函式那一層,上圖有綠色三角的那一層。就定位到洩漏時分配的記憶體了。

from:

剛剛在it部落格網閒逛的時候看到了孤獨的夜 的一片文章《如何除錯mfc中的記憶體洩漏 》,講道用設定_crtbreakalloc這個變數來除錯記憶體洩露的問題。

在how to use _crtbreakalloc to debug a memory allocation 你可以找到英文的更完整的版本,靜態鏈結和動態連線到c執行庫的名稱是不一樣的

靜態:_crtbreakalloc

動態:*__p__crtbreakalloc() (vc++4.0 和4.1版本,估計沒人在用吧)

*__p__crtbreakalloc() (visual c++ 4.2 or later)

_crtbreakalloc (好像這樣也是可以的)

__p__crtbreakalloc()是個什麼東西呢?

檢視msdn索引「advanced breakpoint」and you will find out...

語法如下:

location

variable_name

expression

如何除錯MFC中的記憶體洩漏

首先,應該是mfc報告我們發現記憶體洩漏。注意 要多執行幾次,以確定輸出的內容不變,特別是 之間的數值,不能變,否則下面的方法就不好用了。我們來看看 f codesample test testpipe leaktest mainfrm.cpp 54 normalblockat 0x00422e80...

Visual Studio記憶體洩漏除錯

在可能洩漏的檔案頭部加入下面幾行 保證malloc和new的洩漏都可以檢測到 define crtdbg map alloc include ifdef debug 過載new運算子 define new new normal block,file line endif 然後在程式中加入下面 程式執...

Linux mtrace除錯記憶體洩漏

本文只介紹乙個實用的linux小命令 mtrace memory trace 它能夠用來協助定位記憶體洩露 linux下測試 4 trace.c include includeint main 編譯 gcc 4 trace.c o 4 trace g ddebug 因為我 中沒有debug巨集控制,...