c 語言作為 linux 系統上標準的程式語言給予了我們對動態記憶體分配很大的控制權。這種自由可能會導致嚴重的記憶體管理問題,可能導致程式崩潰或隨時間的推移導致效能降級。
記憶體洩漏(即malloc()
內存在對應的free()
呼叫執行後永不被釋放)和緩衝區溢位(例如對以前分配到某陣列的記憶體進行寫操作)是一些常見的問題,它們可能很難檢測到。這一部分將討論幾個除錯工具,它們極大地簡化了檢測和找出記憶體問題的過程
1. memwatch簡介
memwatch是c語言的記憶體檢測器。除了檢測記憶體的功能外,它同樣可以做其它的一些事情,而我們主要還是在於講述它的基本功能。如果你真的想要知道所有相關的具體細節,可詳細檢視標頭檔案memwatch.h以及源**。
它使用c於處理器的功能,memwatch使用它自己定義的功能函式取代所有在你的程式中用ansi c定義的記憶體分配函式,memwatch的記憶體分配函式包含了了所有的分配記錄資訊。
memwatch可以在交叉編譯後的目標板上執行。
2. memwatch功能
(1) 主要有基本的記憶體管理函式
-mwmalloc()
-mwfree()
-mwcalloc()
-mwrealloc()
(2) memwatch能夠檢測的功能包括
-雙重釋放(double-free)、
-錯誤釋放(erroneous free)、
-記憶體洩漏(unfreed memory)、
-溢位(overflow)、
-下溢(underflow)
3. 編譯
當編譯時, 相讓memwatch起作用, 編譯是加上-dmemwatch
4. memwatch.log內容
在正常操作的情況下,memwatch會建立乙個名叫memwatch.log的檔案。但有的時候,memwatch.log檔案並不能被建立。此時,memwatch會嘗試建立命名類似memwatnn.log的檔案,其中nn是01到99之間的數字。如果還是失敗,則沒有log檔案。
5. 應用例項
清單 1. 記憶體樣本(test1.c)
#include#include
#include "memwatch.h"
int main(void)
清單 1 中的**將分配兩個 512 位元組的記憶體塊,然後指向第乙個記憶體塊的指標被設定為指向第二個記憶體塊。結果,第二個記憶體塊的位址丟失,從而產生了記憶體洩漏。
現在我們編譯清單 1 的 memwatch.c。下面是乙個 makefile 示例:
test1
gcc -dmemwatch -dmw_stdio test1.c memwatchc -o test1
當您執行 test1 程式後,它會生成乙個關於****存的報告。清單 2 展示了示例 memwatch.log 輸出檔案。
清單 2. test1 memwatch.log 檔案
memwatch 為您顯示真正導致問題的行。如果您釋放乙個已經釋放過的指標,它會告訴您。對於沒有釋放的記憶體也一樣。日誌結尾部分顯示統計資訊,包括洩漏了多少記憶體,使用了多少記憶體,以及總共分配了多少記憶體。
Linux記憶體除錯工具 Valgrind使用方法
一.valgrind是什麼?valgrind是乙個提供程式除錯及效能分析的工具集。其包含的工具主要有memcheck,cachegrind,callgrind,massif等。其中,最為常用的是memcheck,其主要用來檢查程式heap上的記憶體使用情況。本文件主要介紹memcheck的用法和一些...
linux下記憶體除錯工具 valgrind
1 valgrind之memcheck 最常用的工具,用來檢測程式中出現的記憶體問題,所有對記憶體的讀寫都會被檢測到,一切對malloc free new delete的呼叫都會 獲。所以,它能檢測以下問題 1 對未初始化記憶體的使用 2 讀 寫釋放後的記憶體塊 3 讀 寫超出malloc分配的記憶...
Linux下的記憶體除錯工具 valgrind
valgrind 工具包包含多個工具,如memcheck,cachegrind,helgrind,callgrind,massif。下面分別介紹個工具的作用 一 memcheck 工具主要檢查下面的程式錯誤 使用未初始化的記憶體 使用已經釋放了的記憶體 使用超過 malloc分配的記憶體空間 對堆疊...