基於linux系統上編碼記憶體洩露

2021-06-03 18:14:34 字數 2123 閱讀 8815

valgrind由核心(core)以及基於核心的其他除錯工具組成。核心類似於乙個框架(framework),它模擬了乙個cpu環境,並提供服務給其他工具;而其他工具則類似於外掛程式 (plug-in),利用核心提供的服務完成各種特定的記憶體除錯任務。valgrind的體系結構如下圖所示:

圖 1 valgrind 體系結構

valgrind包括如下一些工具:

memcheck。這是valgrind應用最廣泛的工具,乙個重量級的記憶體檢查器,能夠發現開發中絕大多數記憶體錯誤使用情況,比如:使用未初始化的記憶體,使用已經釋放了的記憶體,記憶體訪問越界等。這也是本文將重點介紹的部分。

callgrind。它主要用來檢查程式中函式呼叫過程中出現的問題。

cachegrind。它主要用來檢查程式中快取使用出現的問題。

helgrind。它主要用來檢查多執行緒程式中出現的競爭問題。

massif。它主要用來檢查程式中堆疊使用中出現的問題。

extension。可以利用core提供的功能,自己編寫特定的記憶體除錯工具。

linux 程式記憶體空間布局

要發現linux下的記憶體問題,首先一定要知道在linux下,記憶體是如何被分配的?下圖展示了乙個典型的linux c程式記憶體空間布局:

圖 2: 典型記憶體空間布局

乙個典型的linux c程式記憶體空間由如下幾部分組成:

記憶體檢查原理

memcheck檢測記憶體問題的原理如下圖所示:

圖 3 記憶體檢查原理

memcheck 能夠檢測出記憶體問題,關鍵在於其建立了兩個全域性表。

valid-value 表:

對於程序的整個位址空間中的每乙個位元組(byte),都有與之對應的 8 個 bits;對於 cpu 的每個暫存器,也有乙個與之對應的 bit 向量。這些 bits 負責記錄該位元組或者暫存器值是否具有有效的、已初始化的值。

valid-address 表

對於程序整個位址空間中的每乙個位元組(byte),還有與之對應的 1 個 bit,負責記錄該位址是否能夠被讀寫。

檢測原理:

valgrind 使用

第一步:準備好程式

為了使valgrind發現的錯誤更精確,如能夠定位到源**行,建議在編譯時加上-g引數,編譯優化選項請選擇o0,雖然這會降低程式的執行效率。

這裡用到的示例程式檔名為:sample.c(如下所示),選用的編譯器為gcc。

生成可執行程式gcc –g –o0 sample.c –o sample

清單 1

第二步:在valgrind下,執行可執行程式。

利用valgrind除錯記憶體問題,不需要重新編譯源程式,它的輸入就是二進位制的可執行程式。呼叫valgrind的通用格式是:valgrind [valgrind-options] your-prog [your-prog-options]

valgrind 的引數分為兩類,一類是 core 的引數,它對所有的工具都適用;另外一類就是具體某個工具如 memcheck 的引數。valgrind 預設的工具就是 memcheck,也可以通過「--tool=tool name」指定其他的工具。valgrind 提供了大量的引數滿足你特定的除錯需求,具體可參考其使用者手冊。

這個例子將使用 memcheck,於是可以輸入命令入下:valgrind /sample.

第三步:分析 valgrind 的輸出資訊。

以下是執行上述命令後的輸出。

清單 2

示例程式顯然有兩個問題,一是fun函式中動態申請的堆記憶體沒有釋放;二是對堆記憶體的訪問越界。這兩個問題均被valgrind發現。

使用memwatch跟蹤linux記憶體洩漏

參考 根據log可以查詢出申請了卻沒有釋放記憶體的行號。一 簡介 memwatch可以跟蹤程式中的記憶體洩漏和錯誤,能檢測雙重釋放 double free 錯誤釋放 erroneousfree 沒有釋放的記憶體 unfreed memory 溢位 overflow 下溢 underflow 等。解壓...

linux 系統編碼

一。linux系統的預設編碼設定。etc sysconfig i18n controls the system font settings.the language variables are used in etc profile.d lang.sh.an example i18n file la...

linux 系統編碼

一。linux系統的預設編碼設定。etc sysconfig i18n controls the system font settings.the language variables are used in etc profile.d lang.sh.an example i18n file la...