DEBUG 記憶體洩露除錯

2021-05-24 23:51:17 字數 1081 閱讀 3342

呼。。又是一次痛苦的除錯經歷,趕緊記點心得吧。雖然是乙個很傻x的失誤,但是經歷的過程還是收穫蠻多的。開始之前,順便透露一下,關於shero,我已經決定做乙個單機開源rpg了,最遲在5月發布吧,最終效果相信不會令大家失望。。:)

好了,起因是這樣的,因為整合了cegui,介面基本搭好時,卻發現有嚴重的記憶體洩露,至少當時我是這樣認為的,然後便開始嘗試各種辦法,沒有結果。其實最後才發現,原因很簡單,我自己的專案裡加入了這個設定:

_crtsetdbgflag(_crtdbg_alloc_mem_df | _crtdbg_delay_free_mem_df | _crtdbg_check_every_1024_df | _crtdbg_check_crt_df);

_crtdbg_delay_free_mem_df,我**了,英語白學了。在加入cegui以前,專案的每輪迴圈裡不會都有new 與 delete的操作,自然看不出啥問題,但是有了cegui後就不一樣了,new分配的空間是延遲釋放的,不斷堆積後看上去肯定就是嚴重的記憶體洩露了!

上面的不是重點,重點是過程中的一點除錯心得,簡單記錄下吧:

1,關於記憶體洩露檢測,vc環境下可以檢測的,這裡的debug_new有提到。

但是,這種方法不能解決2個問題:

通常更詭異的記憶體洩露是這樣的:程式執行中不斷積累,程式退出時卻會一起釋放的,這種情況是檢測不出的。

對於1,乙個很有用的技巧是,除錯輸出視窗不會顯示原始檔位址,但是會顯示這個未分配block的id,知道這個id後,在程式中加入_crtsetbreakalloc(id),再執行程式,就會在分配這個block時中斷,這樣除錯就有堆疊輸出視窗了,這樣就可以知道是附加模組**的問題了。

對於2,除開其他除錯技巧,其實用1的辦法也會有幫助,那就是在_crtsetbreakalloc(id)裡,不斷更改id值,視具體情況,達到對問題根源的準確定位。

2,關於release下執行出現指標訪問錯誤,debug下卻沒問題的可能原因:

檢查debug下所有warning

某些函式不是每個路徑都有返回值

物件建構函式裡不是對每個成員變數都做了初始化(這個最有可能)

也可能有其他原因,以後再整理。over。

iOS SN Xcode記憶體洩露除錯

用xcode進行記憶體除錯有兩種方法 1 靜態方法 2 動態方法 靜態方法是直接在xcode的選單欄中選擇product analyze 如截圖所示。提示有可能有多少洩露物件,這裡還沒有編譯完,提示有199個,然後再如下圖所示 就會看到具體的提示,有的提示會有潛在的洩露物件,有的提示垃圾物件,或者值...

記憶體洩露除錯分析 一

1.檢視記憶體使用情況 cat proc meminfo 其中sunreclaim 695168 kb,隨著測試時間加長sunreclaim一直在增加,證明存在記憶體洩露可能.檢視slab分配資訊 cat proc slabinfo 其中skbuff head cache和kmalloc 1024分...

windbg除錯 記憶體洩露 不斷上公升

在大型專案中,記憶體洩露並不會立即 crash 會使系統效能不斷下降,甚至因記憶體耗盡而崩潰。排查起來難度也比較大,申請記憶體的地方很多。這裡介紹的這種方法可以迅速定位問題。下面的程式crash64,每秒會申請1m的記憶體,而一直都沒有釋放,產生記憶體洩露 windbg 中有個小工具 umdh可以追...