new malloc 記憶體申請轉儲

2021-05-26 03:06:41 字數 2008 閱讀 7864

關於記憶體洩露,大概半年前曾查過一次,也寫過總結,但太粗了,現在看來參考價值不怎麼大。

無論windows的crt庫函式方式,如crtmemstate,_crtmemcheckpoint,_crtmemedifference,_crtdumpmemoryleaks,_crtmemdumpallobjectssince等,或者windows其他記憶體洩露的檢查工具,甚至是與系統無關的檢查方式,只要時原始碼形勢的,一般都是通過替換new,malloc,delete,free的實現。

c++中的new可以過載,譬如為

void * operator new(size_t nsize, const char * filename, int nline)

void * operator new(size_t nsize, const char * filename, int nline)

在實現中將可以依然呼叫全域性的new,如::operator new 也可使用malloc分配記憶體,並將得到的位址,new的呼叫處的檔名,行數儲存起來即可,為此可以使用map這裡***為要儲存的內容組成的結構。

在delete的實現中可以從map中清除此節點。

如此在乙個需要測量的週期之後,沒有被delete掉的就扔保留在此map中了,可以通過遍歷此馬匹得到申請記憶體的檔名及所在行。

但什麼時間用過載什麼時間不用呢,如果全部用了,必將對頭檔案中的尤其是系統標頭檔案造成影響。我們只需要在我們的**中使用即可。如此以來,只需在原始檔的include與之後,**之前新增#define new dbg_new即可,其中#define dbg_new new(__file__,__line__)可以預先定義好。

對於malloc則沒有過載一回事了,但可以另造乙個函式,例如windows crt中的實現

#ifdef  _crtdbg_map_alloc

#define   malloc(s)         _malloc_dbg(s, _normal_block, __file__, __line__)

#define   calloc(c, s)      _calloc_dbg(c, s, _normal_block, __file__, __line__)

#define   realloc(p, s)     _realloc_dbg(p, s, _normal_block, __file__, __line__)

#define   _expand(p, s)     _expand_dbg(p, s, _normal_block, __file__, __line__)

#define   free(p)           _free_dbg(p, _normal_block)

#define   _msize(p)         _msize_dbg(p, _normal_block)

#endif

即通過_malloc_dbg實現的記憶體分配,_malloc_dbg的實現中呼叫了_nh_malloc_dbg,後者在乙個雙向鍊錶_crtmemblockheader中維護這記憶體的分配與釋放。

因為_malloc_dbg 與 _nh_malloc_dbg的實現在dbgheap.c檔案中,如果想要修改這裡面的**啊,除非重新編譯c庫,否則並不會生效。

我曾試圖修改_malloc_dbg,使得對分配指定大小的記憶體時執行乙個打了斷點的簡單語句,從而方便跟蹤,但因為如上原因未能生效,變通的實現是自己在工程中加了_malloc_dbg2  在這個函式內修改,並#define malloc(s) _malloc_dbg2(s,_normal_block, __file__, __line__)實現。

以上實現,完全可輕易寫出不依賴平台的**的...

值得提醒的是,如果在**中呼叫了第三方庫,而記憶體是在裡面申請的,則這是跟不到的。近期乙個記憶體洩露,不停的提醒如果平台庫中申請的記憶體是跟不到的,偏偏忘了是openssl的庫,到了最後被查出來了才恍然大悟,原來是evp框架初始化申請了記憶體卻沒有cleanup造成的。

openssl有自己的記憶體維護機制,可以檢查並報告記憶體洩露。以前08,09年左右還研究使用過,現在分析時頭腦浮現了兩次,卻始終沒在上面深入,慚愧啊。

神策軍丨我申請轉正

篳路藍縷,以啟山林 在工作中,認定自己擁有一往無前的勇氣,可手無寸鐵禦敵,也可襤褸艱苦開山,入職時正值 2020 疫情峰期過後全國復工浪潮,轉正時又恰好上海疫情突發,與在神策的經歷很像,一路困難重重以為在森林裡迷路,仔細一看原來都是撥得開的迷霧。知道神策技術很牛才奔此而來,果不其然,想要花時間好好把...

WM630 107 轉儲申請建立轉儲訂單

tr自動建立to spro 後勤執行 倉庫管理 介面 庫存管理 定義移動型別 a im建立物料憑證的時候,後台自動建立to x im建立物料憑證的時候,自動調整到建立to介面 後台處理,當建立報錯時message訊息報錯給誰,可以是當前登入賬號,也可以指定接收人 例如後台呼叫,報錯訊息指定給運維人員...

coredump Linux記憶體轉儲

coredump 簡單來說,core dump說的是作業系統執行的乙個動作,當某個程序因為一些原因意外終止 crash 的時候,作業系統會將這個程序當時的記憶體資訊轉儲 dump 到磁碟上1。產生的檔案就是core檔案了,一般會以core.形式命名。如何產生core dump 一般來說,當程序接收到...