1. 程式人生 > >Linux之記憶體洩露的檢測工具

Linux之記憶體洩露的檢測工具

linux背後隱藏著各種各種豐富的寶藏,找到這些工具,學會這些工具,讓這些工具更好地服務於我們的專案開發,不僅可以提高工作的效率,而且可以增強個人技術力。所以圍繞在MK1階段和MK23階段,有哪些工具可以輔助我們的工作,我們展開了此次技術調查。

[應用範圍]
MK1階段和MK23階段的記憶體檢測

[正文]

對比:

mtrace: 不需要安裝,使用時包含一個頭檔案,程式中在需要的呼叫mtrace和muntrace方法即可

memwatch: 在需要檢測的.c檔案裡面包含memwatch.h檔案,編譯的時候加上幾個引數即可

splint:需要下載原始碼並安裝程式,通過標誌和註釋來獲取想要的錯誤資訊

valgrind:提供不同的工具來實現不同功能的檢測,需要編譯原始碼

使用:

一. mtrace使用方法:

mtrace只能檢測malloc,realloc和free引發的錯誤。

用法如下: 

   1. 定義巨集export MALLOC_TRACE=<malloc_trace_filename>

例如:MALLOC_TRACE=mlog.txt

如果不定義巨集或者不能定義巨集,使用setenv函式,下面是setenv函式原型:

#include <stdlib.h>

--int setenv(const char *name, const char *value, int overwrite)

該函式是用來新增或者改變一個環境變數,name是變數名,value是值,如果變數已經存在並且overwrite為0,不改變變數值,如果overwrite不為0,則使用環境變數的新值覆蓋舊值。

一個使用的例子:setenv("MALLOC_TRACE", "mlog.txt", 1); 

   2. 在.c檔案中引用#include <mcheck.h>

   3. 在開始申請記憶體之前,呼叫mtrace();

   4. 執行編譯後生成的可執行檔案,如果程式結束,對於生成的mlog.txt,使用mtrace mlog.txt 或者 mtrace <可執行檔案> mlog.txt

   5. 如果程式會一直執行,在程式適當的地方呼叫muntrace函式,就會生成log檔案 

如果對一塊記憶體free多次,程式執行被打斷,終端打印出錯誤。   

 一個簡單的例子:

#include <stdio.h>

#include <mcheck.h>

#include <stdlib.h>

int main()

{

setenv("MALLOC_TRACE", "mlog.txt", 1);

char *p;

mtrace();

p = (char *)malloc(4);

p = (char *)malloc(5);

while( 1 )

{

sleep(4);

muntrace();

}

return 0;

}

二. memwatch使用方法:

memwatch可以檢測:未釋放的記憶體,同一段記憶體被釋放多次和使用未分配記憶體區域,溢位和下溢等錯誤;

右邊是使用memwatch要用到的原始碼。

步驟:

  1. 確保被測工程中有memwatch.cmemwatch.h檔案,

  1. 原始碼中每個.c檔案中都include標頭檔案memwatch.h

  1. 編譯程式碼,gcc後新增-DMEMWATCH  -DMW_STDIO或者-DMEMWATCH_STDIO,還有memwatch.c檔案,

  1. 執行生成的可執行檔案,程式執行結束後,生成的log檔名為memwatch.log,如果未生成上述檔案,則會寫入memwatNN.log檔案,NN01~99,如果還未成功,則放棄寫log檔案。

注:memwatch會使系統速度減慢

三. splint使用:

 splint是靜態程式碼檢測工具,可以檢查包括:

Null Dereferences:針對空指標

Undefined Values:未初始化資料

Types:轉化型別不一致

Memory Management:記憶體管理檢測,如記憶體洩露

sharing:共享儲存空間安全性檢測

Function Interfaces:函式介面檢測(引數傳遞等)

Control Flow:函式執行分支檢測

Buffer Sizes:緩衝區邊界檢查

Completeness:完整性檢查,包括未使用變數、函式等

還有Macros(巨集隱患檢測等)

還有其他的應用。

 原始碼包安裝:

#tar zxvf splint-3.1.2.src.tgz

#cd splint-3.1.2

#mkdir /usr/local/splint

#./configure --prefix=/usr/local/splint

#make

#make install

#vi ~/.bashrc    (或者 sudo gedit ~/.bashrc) ~目錄是/root

新增:

export LARCH_PATH=/usr/local/splint/share/splint/lib

export LCLIMPORTDIR=/usr/local/splint/share/splint/import

#source ~/.bashrc

#export PATH=/usr/local/splint/bin/splint:$PATH

到此,splint原始碼安裝完成。

splint提供了三種方式進行檢查的控制,分別是flags標誌、 .splintrc配置檔案和格式化註釋。

flags: splint支援幾百個標誌用來控制檢查和訊息報告,使用時標誌前加‘+’或‘-’,‘+’標誌開啟這個標誌,‘-’表示關閉此標誌。下面例子展示了flags標誌的用法:

splint -showcol a.c //在檢測a.c時,告警訊息中列數不被列印

splint -varuse a.c //在檢測a.c時,告警訊息中未使用變數告警不被列印

.splintrc配置檔案: .splintrc檔案中對一些flags做了預設的設定,命令列中指定的flags會覆蓋.splintrc檔案中的標誌。

格式化註釋:格式化註釋提供一個型別、變數或函式的額外的資訊,可以控制標誌設定,增加檢查效果。所有格式化註釋都以/*@開始,@*/結束,比如在函式引數前加/*@[email protected]*/,表示該引數可能是NULL,做檢測時,splint會加強對該引數的值的檢測。

四. valgrind使用:

步驟:

1tar -xf valgrind-3.9.0.tar.bz2

2:./configure

3:make

4:make install(如果失敗,改用root許可權)

5:valgrind ls -l(檢查是否正常工作,如果出錯,按照提示安裝相應檔案)

下面的工具是valgrind安裝時的標準配置:

Memcheck:用於檢測記憶體錯誤。它幫助c和c++的程式更正確。

Cachegrind:用於分析cache和分支預測。它幫助程式執行得更快。

Callgrind:用於函式呼叫的分析。

Helgrind:用於分析多執行緒。

DRD:也用於分析多執行緒。與Helgrind類似,但是用不同的分析技術,所以可以檢測不同的問題。

Massif:用於分析堆。它幫助程式精簡記憶體的使用。

SGcheck:檢測棧和全域性陣列溢位的實驗性工具,它和Memcheck互補使用。

--leak-check=yes開啟記憶體洩露檢測細節

--tool=helgrind使用Helgrind工具檢測執行緒錯誤

假設hello是可執行程式:可能的使用方法如下

valgrind --leak-check=yes ./hello

或者valgrind ./hello

終端上顯示檢測資訊。

相關推薦

linux記憶體洩露檢測工具Valgrind介紹

一、工作中一個記憶體洩漏問題的解決過程: 問題背景:我司裝置上執行有多個程序,在裝置執行兩天後,程序jsman所佔用的記憶體達到了1200M bytes(通過ps -aux檢視)。 解決步驟: 確定裝置上的軟體版本,根據git的commit號資訊回退

Linux記憶體洩露檢測工具

linux背後隱藏著各種各種豐富的寶藏,找到這些工具,學會這些工具,讓這些工具更好地服務於我們的專案開發,不僅可以提高工作的效率,而且可以增強個人技術力。所以圍繞在MK1階段和MK23階段,有哪些工具可以輔助我們的工作,我們展開了此次技術調查。 [應用範圍] MK1階段

Windows/Linux下C/C++記憶體洩露檢測工具

一 Window下的記憶體洩露檢測(以VC++環境為例) 靈活自由是C語言的一大特色,但這個特色也難以避免的帶來一些副作用,比如記憶體洩露。眾所周知,記憶體洩露的問題比較複雜,程式正常執行時你看不出它有任何異常,但長時間執行或在特定條件下特定操作重複多次時,它才暴露出來。所

Linux C 程式設計記憶體洩露檢測工具(二):memwatch

Memwatch簡介 在三種檢測工具當中,設定最簡單的算是memwatch,和dmalloc一樣,它能檢測未釋放的記憶體、同一段記憶體被釋放多次、位址存取錯誤及不當使用未分配之記憶體區域。請往http://www.linkdata.se/sourcecode.html下載最

精準 iOS 記憶體洩露檢測工具----MLeaksFinder

背景 平常我們都會用 Instrument 的 Leaks / Allocations 或其他一些開源庫進行記憶體洩露的排查,但它們都存在各種問題和不便,我們逐個來看這些工具的使用和存在的問題。 Leaks 先看看 Leaks,從蘋果的開發者文件裡可以看到,一個 app 的記憶體分三類:

Visual C++ 記憶體洩露檢測工具(VLD)

簡述 C/C++ 程式越複雜,記憶體的管理顯得越重要,稍有不慎就會出現洩漏。如果記憶體洩漏不是很嚴重,在短時間內對程式不會有太大影響,這也使得記憶體洩漏問題有很強的隱蔽性,不易被發現。然而不管記憶體洩漏多麼輕微,當程式長時間執行時,其破壞力是驚人的 - 從效能

Android記憶體洩露檢測工具和實際開發中遇到的記憶體洩露問題解析

介紹 記憶體洩露是平常開發中經常遇到的,有些時候稍不注意就會發生,而且還不易察覺,這就需要工具來幫助檢測。本文主要介紹記憶體檢測工具和我在開發中遇到的記憶體洩露問題和解決方案。 記憶體洩露的原理 具體的原理涉及到虛擬機器垃圾回收機制知識,這裡只為下文作

iOS-記憶體洩露檢測工具(MLeaksFinder)

MLeaksFinder MLeaksFinder helps you find memory leaks in your iOS apps at develop time. It can automatically find leaks in UIVi

Mac下C++記憶體洩露檢測工具

1) nvwa(寓意女媧補天,從sourceforge下載),直接將其程式碼編譯到工程中,發現有洩露後程序即終止; nvwa能夠檢測到記憶體洩露問題,但是試用後感覺不穩定 2) leaks命令,能確

初識記憶體洩露檢測工具VisualLeakDetector

VLD為vc++下的記憶體洩露檢測工具 1、首先下載安裝vld,直接下載安裝包,安裝過程中會直接新增環境變數。 2、在安裝目錄下有vld.h, vldapi.h, vld.lib, vldmt.lib, vldmtdll.lib, dbghelp.dll等檔

linux C記憶體洩露檢測實現及記憶體洩露檢測的一般方法

linux中,由於使用malloc或alloc而沒有free掉申請的記憶體,就會造成記憶體的洩露。通常,來講為了避免記憶體洩露的情況出現,一般要求,我們儘量的malloc之後,呼叫free。但是總會有忘記free的時候啊。一般可以有如下幾種方式來避免記憶體洩露: 1) 

記憶體洩露檢測工具比較

1.     ccmalloc-Linux和Solaris下對C和C++程式的簡單的使用記憶體洩漏和malloc除錯庫。 2.     Dmalloc-Debug Malloc Library. 3.     Electric Fence-Linux分發版中

Wince記憶體洩露檢測工具Application Verifier的使用和如何快速定位洩露語句(二)

通過Application Verifier在wince端生成日誌檔案後,我們將檔案拷貝到PC上通過PC端的工具進行日誌分析,我們就可以定位出洩漏地址的程式碼行位置了,這裡有個前提條件,那就是需要我們在編譯程式時將程式的除錯資訊開啟,VS2008設定選項配置方法如下: 1.

記憶體洩露檢測工具Valgrind

記憶體洩露簡介 什麼是記憶體洩漏   記憶體洩漏(Memory Leak)是指程式中已動態分配的堆記憶體由於某種原因,程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。  記憶體洩漏缺陷具有隱蔽性、積累性的特徵,比其他記憶體非法訪問錯誤更難檢測。因為記憶體洩漏的產生原

Linux下利用Valgrind工具進行記憶體洩露檢測和效能分析

Valgrind通常用來成分析程式效能及程式中的記憶體洩露錯誤 一 Valgrind工具集簡紹 Valgrind包含下列工具:     1、memcheck:檢查程式中的記憶體問題,如洩漏、越界、非法指標等。     2、callgrind:檢測程式程式碼的執行

arm linux下交叉編譯valgrind工具進行記憶體洩露檢測和效能分析

C/C++等底層語言在提供強大功能及效能的同時,其靈活的記憶體訪問也帶來了各種糾結的問題。如果crash的地方正是記憶體使用錯誤的地方,說明你人品好。如果crash的地方記憶體明顯不是consistent的,或者記憶體管理資訊都已被破壞,編譯器不能發現這些問題,.執行時才能捕獲到這些錯誤並且還是隨機出現的,那

Linux核心的Kmemleak實現記憶體洩露檢測

1. Kmemleak的使用方法     a. 在uboot的bootarg中加入"kmemleak=on"     b. 在.config中使能如下配置 CONFIG_HAVE_DEBUG_KMEMLEAK=y CONFIG_DEBUG_KMEMLEAK=y CONFIG_

Linux中的常用記憶體問題檢測工具

C/C++等底層語言在提供強大功能及效能的同時,其靈活的記憶體訪問也帶來了各種糾結的問題。如果crash的地方正是記憶體使用錯誤的地方,說明你人品好。如果crash的地方記憶體明顯不是

使用Visual Leak Detector for Visual C++ 捕捉記憶體洩露---Visual C++記憶體洩露檢測—VLD工具使用說明

以下經過測試: 使用Visual Leak Detector for Visual C++ 捕捉記憶體洩露 1、下載vlc 2、建立應用並配置 c/c++ -> General -> Additional Include Directories = C:\P

Linux記憶體洩露工具Valgrind

Valgrind 安裝 1、 到www.valgrind.org下載最新版valgrind-3.2.3.tar.bz2 2、 解壓安裝包:tar –jxvf valgrind-3.2.3.tar.bz2 3、 解壓後生成目錄valgrind-3.2.3 4、 cd