visual studio下C++的記憶體泄露調試技巧(部分轉)。

來源:互聯網
上載者:User

有些記憶體泄露是不會dump出來詳細資料的,只會給出記憶體塊號,這種情況一下一般可以用一下方法調試出來。

  這兩天調一個程式,發現每次退出都有記憶體流失,在此總結一個調試記憶體流失的好方法。

    對於比較明顯的記憶體流失,vc2008是比較容易定位的,在Debug模式F5運行,退出時會列出引起記憶體流失的問題代碼所在檔案及行號;但如果是比較隱形記憶體流失,Output輸出視窗只會輸出部分資訊,形式如下:

    Detected memory leaks!
    Dumping objects ->
    {858} normal block at 0x003ED290, 12 bytes long.
    Data: < \H         > A0 5C 48 00 00 00 00 00 00 00 00 00
    Object dump complete.

    我們來看一下輸出資訊的格式。

    {xxx} — 表示程式運行後第xxx次記憶體配置發生了泄漏,即記憶體配置編號;

    xxx block — 表示記憶體塊類型,包括三種:普通(normal)、用戶端(client)和運行時(CRT);

    at 0xFFFFFFFF — 表示發生泄漏的記憶體位址,用十六進位表示;

    xx bytes long — 表示發生泄漏的記憶體大小;

    Data:xxx — 表示記憶體資料資訊,一般輸出前16位元組的內容。

    記憶體流失的地址、大小和資料資訊很難對我們的定位起到有效地協助,但是如果我們能夠讓程式停在分配有泄漏的記憶體的地方,然後根據呼叫堆疊(Call Stack)裡的資訊,就可以很方便的定位是哪個語句出現問題。幸運的是,VC的C運行庫(C run-time library)為我們提供了一個這樣的函數:CrtSetBreakAlloc,聲明如下: 

long _CrtSetBreakAlloc( long lBreakAlloc );

    其中參數lBreakAlloc即為記憶體配置號(花括弧中的數字)。我們只要在程式初始化函數中添加語句:_CrtSetBreakAlloc(858)就可以使程式在Debug F5運行時自動斷點到我們想要的位置。

    使用這個函數進行記憶體流失定位有個條件,即發生記憶體流失的分配號是固定的,每次啟動程式不會隨機變化。 

    但是如果我們的程式比較大,記憶體流失也不止一個,用上面的方法調試可能會很麻煩,需要經常更新代碼並重新編譯器。還有更好的方法。

 

    首先確定自己的程式使用的是哪個C運行庫,方法是程式Propertise -> C/C++ -> Code Generation -> Runtime Library選項,若為Multi-threaded Debug(/MTd),則為靜態連結,若為Multi-threaded Debug DLL(/MDd),則為動態連結。

    然後按F11啟動程式,程式會停在進入點。此時調出Watch視窗,

    靜態連結 在name項中輸入_crtBreakAlloc,在value項中輸入你要定位的記憶體配置編號;

    動態連結 在name項中輸入{,,msvcr90d.dll}_crtBreakAlloc,在value項中輸入記憶體配置號。注意msvcr90d.dll是vc2008環境使用的運行庫dll,若你用的是其他版本vc,請換成對應版本的dll。

    現在按F5運行,程式就會自動定位到你要調試的記憶體配置語句,這時候看call stack的資訊會很有協助。

    這個辦法使用起來非常靈活,只要你確定記憶體配置號是不變的,就可以方便地為程式設定斷點了,省去了更新代碼和編譯的麻煩。這個方法幾乎是當前進行記憶體流失調試的最有效方法,如果你發現記憶體流失的分配號是變化的,可以想辦法去掉一些沒有問題的記憶體申請(多半是介面和多線程涉及到的申請),盡量使有問題的分配固定,就可以用這個方法排錯了。

http://blog.sina.com.cn/s/blog_48f93b530100hnls.html

http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q151/5/85.asp&NoWebContent=1

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.