Linux記憶體除錯工具初探 MEMWATCH

2021-09-22 21:43:55 字數 1738 閱讀 8665

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 memwatch

c -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分配的記憶體空間 對堆疊...