記憶體洩漏 1 記憶體洩漏概念與測試工具介紹

2021-09-02 11:37:48 字數 1892 閱讀 5015

序言:

2023年5月的時候,因為工作需要專門去研究了記憶體洩漏。主要是要去檢測linux c專案**以及python**。對linux c的記憶體洩漏檢測可能還比較熟悉,但是對指令碼語言python進行記憶體洩漏的測試,我一開始表示完全不知情,隨著查詢資料,才逐漸明朗。所以這個記憶體洩漏版塊,主要為了記錄一下當時是如何選擇工具,為什麼選擇這個工具,如何使用這個工具,效果怎麼樣。

記憶體洩露是指程式執行期間動態分配了記憶體,但是在程式結束時沒有釋放這部分記憶體,從而造成那一部分記憶體不可用的情況。一般重啟計算機可以解決,但可能再次發生記憶體洩露。記憶體洩露和硬體沒有關係,它是由軟體設計缺陷引起的。

按發生的方式來分類,記憶體洩漏可以分為4 類:

壓力測試:如對乙個http應用進行壓力測試,經常發現被測試物件程序在併發時記憶體占用不合理。此時常用方式為loadrunner施壓結合響應時間的曲線圖來監控。記憶體洩漏問題多半在壓力測試中出現,也是源於程式編寫過程中沒有規範化管理所導致,開發人員可結合記憶體監測工具來有效監控自己的程式。

測試工具:利用市面上專門檢測記憶體洩漏的測試工具(具體根據語言的不同,相應的測試工具也不盡相同)。此時,涉及靜態分析技術(直接分析程式的源**)和源**插裝技術(在保持被測程式的邏輯完整性的基礎上,在被測程式的特定部位插入一段檢測程式,又稱探針函式,(通過探針的執行丟擲程式的執行特徵資料)。

白盒測試(人工設定斷點檢視):首先得根據具體語言如c,python等充分了解什麼情況下會造成記憶體洩漏。再一一根據這些具體條件測試是否存在記憶體洩漏問題。比如c語言,c語言記憶體的洩漏,是通過malloc、calloc等函式申請的記憶體沒釋放,因此記憶體洩漏的檢測方法核心思想就是,通過巨集自定義分配及釋放函式來替換使用者的malloc、calloc、free等函式。設計資料結構記錄記憶體申請資訊。申請記憶體時,記錄並插入到全域性的鍊錶中。釋放記憶體時從全域性鍊錶中查詢對應的記錄,並刪除。程式結束時,將鍊錶中資訊寫入檔案,清除鍊錶。只要在分配記憶體和釋放記憶體時分別做好記錄,程式結束時對比分配記憶體和釋放記憶體的記錄就可以確定是不是有記憶體洩漏。

visual c++平台開發,用numega的boundschecker(該方法沒有實踐過)

linux平台 開源工具valgrind(後面有乙個詳細講解使用valgrind檢查python記憶體洩露的例子)

klocwork的k7

coverity的sqs

c++test的bugdetective

lclink

ccmalloc-linux和solaris下對c和c++程式的簡單的使用記憶體洩漏和malloc除錯庫

leaky-linux下檢測記憶體洩漏的程式

cppcheck(後面會詳細講解)

python的gc模組+pyrasite模組檢查python程式記憶體洩露(後面會詳細講解)

tracemalloc 檢測python記憶體洩露

當時所接觸到測試,需要編寫測試用例,最終實現的效果是實現自動化測試。所以就需要整合的測試環境平台,可以實現自動構建,自動執行,最終以圖形化的形式顯示測試結果。所以jenkins是個不錯的選擇。

下面貼上幾張在jenkins上實現的自動化測試的乙個效果圖:

後續還會更新:

【記憶體洩漏】- 2. 使用cppcheck+jenkins檢測c、c++記憶體洩漏

【記憶體洩漏】- 3. 使用splint檢測c、c++記憶體洩漏

【記憶體洩漏】- 4. 使用python的gc+pyrasite模組檢測python記憶體洩漏

【記憶體洩漏】- 5. 使用valgrind工具檢測python記憶體洩漏

Qt 記憶體洩漏測試

在說qt的記憶體測試之前,首先需要說明和肯定的一點是 qt是絕對沒有記憶體洩漏的,我們必須相信這一點。接下來,說明一下基於linux的qt記憶體測試工具及其用法和說明 一 記憶體測試工具valgrind 安裝就不具體說了,網上一堆堆的 二 用法 安裝完valgrind之後,開啟qt creator,...

記憶體洩漏與記憶體溢位

概念 記憶體溢位指的是我們的程式在申請的記憶體時,沒有足夠的記憶體空間供其使用。記憶體洩漏指的是我們占用了某塊記憶體,而又不再使用它,長期堆積的記憶體洩漏也將導致記憶體溢位。舉例 當我們去自助餐吃牛排的時候,本來乙個盤子只能裝幾片西瓜,結果我們裝了十多片導致西瓜掉出來了,這就是記憶體上溢,這是從小的...

記憶體洩漏與記憶體溢位

記憶體洩露是指你的應用使用資源之後沒有及時釋放,導致應用記憶體中持有了不需要的資源 狀態描述 記憶體溢位是指你的應用的記憶體已經不能滿足正常使用了,堆疊已經達到系統設定的最大值,進而導致崩潰,結果描述 通常都是由於記憶體洩露導致堆疊記憶體不斷增大,從而引發記憶體溢位 洩漏是說你的程式有bug 導致記...