Valgrind簡(jiǎn)介
Valgrind是一套Linux下,開放源代碼(GPL V2)的仿真調(diào)試工具的集合。
Valgrind工具包包含多個(gè)工具,如Memcheck、Cachegrind、Helgrind、Callgrind、Massif。
Memcheck工具
Memcheck工具是Valgrind中最常用的工具,用來(lái)檢測(cè)程序中出現(xiàn)的內(nèi)存問題。它能檢測(cè)如下問題:
使用未初始化內(nèi)存;
使用釋放后的內(nèi)存;
使用超出malloc分配的內(nèi)存塊;
對(duì)堆棧的非法訪問;
內(nèi)存泄漏;
不正確的malloc/free或new/delete匹配;
memcpy()相關(guān)函數(shù)中的dst和src指針重疊。
Cachegrind工具
Callgrind收集程序運(yùn)行時(shí)的一些數(shù)據(jù),函數(shù)調(diào)用關(guān)系等信息,還可以有選擇地進(jìn)行cache模擬。在運(yùn)行結(jié)束時(shí),它會(huì)把分析數(shù)據(jù)寫入一個(gè)文件。callgrind_annotate可以把這個(gè)文件的內(nèi)容轉(zhuǎn)化成可讀的形式。
Helgrind工具
它主要用來(lái)檢查多線程程序中出現(xiàn)的競(jìng)爭(zhēng)問題。Helgrind尋找內(nèi)存中被多個(gè)線程訪問,而又沒有一貫加鎖的區(qū)域,這些區(qū)域往往是線程之間失去同步的地方,而且會(huì)導(dǎo)致難以發(fā)掘的錯(cuò)誤。
Helgrind實(shí)現(xiàn)了名為” Eraser” 的競(jìng)爭(zhēng)檢測(cè)算法,并做了進(jìn)一步改進(jìn),減少了報(bào)告錯(cuò)誤的次數(shù)。
Callgrind工具
它模擬 CPU中的一級(jí)緩存I1,D1和L2二級(jí)緩存,能夠精確地指出程序中 cache的丟失和命中。如果需要,它還能夠?yàn)槲覀兲峁ヽache丟失次數(shù),內(nèi)存引用次數(shù),以及每行代碼,每個(gè)函數(shù),每個(gè)模塊,整個(gè)程序產(chǎn)生的指令數(shù)。這對(duì)優(yōu)化程序有很大的幫助。
Massif工具
堆棧分析器,它能測(cè)量程序在堆棧中使用了多少內(nèi)存,告訴我們堆塊,堆管理塊和棧的大小。
Massif能幫助我們減少內(nèi)存的使用,在帶有虛擬內(nèi)存的現(xiàn)代系統(tǒng)中,它還能夠加速我們程序的運(yùn)行,減少程序停留在交換區(qū)中的幾率。
Valgrind由內(nèi)核(core)以及基于內(nèi)核的其他調(diào)試工具組成。其基于仿真方式對(duì)程序進(jìn)行調(diào)試,它先于應(yīng)用程序獲取實(shí)際處理器的控制權(quán),并在實(shí)際處理器的基礎(chǔ)上仿真一個(gè)虛擬處理器,并使應(yīng)用程序運(yùn)行于這個(gè)虛擬處理器之上,從而對(duì)應(yīng)用程序的運(yùn)行進(jìn)行監(jiān)視。
應(yīng)用程序并不知道該處理器是虛擬的還是實(shí)際的,已經(jīng)編譯成二進(jìn)制代碼的應(yīng)用程序并不用重新進(jìn)行編譯,Valgrind 直接解釋二進(jìn)制代碼使得應(yīng)用程序基于它運(yùn)行,從而能夠檢查內(nèi)存操作時(shí)可能出現(xiàn)的錯(cuò)誤。
所以在Valgrind下運(yùn)行的程序運(yùn)行速度要慢得多,而且使用的內(nèi)存要多得多。因此,最好在性能好的機(jī)器上使用Valgrind,并且是在開發(fā)調(diào)試階段使用。
Valgrind安裝
Valgrind的安裝方式很簡(jiǎn)單。我們首先查看一下我們的系統(tǒng)中有沒有Valgrind:
顯然,我們這里的系統(tǒng)中沒有Valgrind,按提示輸入如下命令安裝即可:
sudoaptinstallvalgrind
另外,也可以通過下載源碼編譯、安裝。
源碼地址:
?
http://valgrind.org/
?
下載源碼的命令:
wgethttp://valgrind.org/downloads/valgrind-3.14.0.tar.bz2
Valgrind使用
準(zhǔn)備一個(gè)有內(nèi)存泄漏、內(nèi)存越界問題的demo進(jìn)行測(cè)試。為了方便,我們使用官方提供的一個(gè)經(jīng)典的測(cè)試demo:
「valgrind_test.c:」
#includevoidf(void) { int*x=malloc(10*sizeof(int)); x[10]=0;//problem1:heapblockoverrun }//problem2:memoryleak--xnotfreed intmain(void) { f(); return0; }
這份代碼存在兩個(gè)問題:
使用超出malloc分配的內(nèi)存。
內(nèi)存泄漏。
下面一起來(lái)使用valgrind的Memcheck工具來(lái)檢測(cè)這份程序。
首先,我們使用-g編譯程序以包含調(diào)試信息,以便Memcheck的錯(cuò)誤消息包含確切的行號(hào)。
gcc-gvalgrind_test.c-ovalgrind_test
使用valgrind檢測(cè)valgrind_test程序:
valgrind--leak-check=yes./valgrind_test
我們可以用--tool參數(shù)指明使用的工具,如:
--tool=memcheck
如果不明確設(shè)置--tool參數(shù),則valgrind的檢測(cè)工具默認(rèn)使用的是Memcheck工具。--leak-check=yes選項(xiàng)打開詳細(xì)的內(nèi)存泄漏檢測(cè)器。
我們執(zhí)行檢測(cè)工具之后的結(jié)果如:
==7407==Memcheck,amemoryerrordetector ==7407==Copyright(C)2002-2017,andGNUGPL'd,byJulianSewardetal. ==7407==UsingValgrind-3.13.0andLibVEX;rerunwith-hforcopyrightinfo ==7407==Command:./valgrind_test ==7407== ==7407==Invalidwriteofsize4 ==7407==at0x108668:f(valgrind_test.c:6) ==7407==by0x108679:main(valgrind_test.c:11) ==7407==Address0x522d068is0bytesafterablockofsize40alloc'd ==7407==at0x4C2FB0F:malloc(in/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==7407==by0x10865B:f(valgrind_test.c:5) ==7407==by0x108679:main(valgrind_test.c:11) ==7407== ==7407== ==7407==HEAPSUMMARY: ==7407==inuseatexit:40bytesin1blocks ==7407==totalheapusage:1allocs,0frees,40bytesallocated ==7407== ==7407==40bytesin1blocksaredefinitelylostinlossrecord1of1 ==7407==at0x4C2FB0F:malloc(in/usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==7407==by0x10865B:f(valgrind_test.c:5) ==7407==by0x108679:main(valgrind_test.c:11) ==7407== ==7407==LEAKSUMMARY: ==7407==definitelylost:40bytesin1blocks ==7407==indirectlylost:0bytesin0blocks ==7407==possiblylost:0bytesin0blocks ==7407==stillreachable:0bytesin0blocks ==7407==suppressed:0bytesin0blocks ==7407== ==7407==Forcountsofdetectedandsuppressederrors,rerunwith:-v ==7407==ERRORSUMMARY:2errorsfrom2contexts(suppressed:0from0)
輸出結(jié)果包含有很多信息,我們可以很容易查看到了關(guān)鍵的信息:
其中,輸出信息告訴我們無(wú)效地寫入了4個(gè)字節(jié),并且提示了可能出現(xiàn)問題的代碼行數(shù)。堆棧跟蹤告訴我們調(diào)用了一次malloc申請(qǐng)內(nèi)存,但并沒有free,并且指出了在哪里分配了內(nèi)存。
另外,這里的7407表示的是進(jìn)程ID號(hào)。
內(nèi)存泄漏有幾種類型,最重要的兩類是:
definitely lost(明確的泄漏)
possibly lost(可能的泄漏)
其中,明確的泄漏必須要進(jìn)行修復(fù)。
以上就是關(guān)于valgrind最常用的Memcheck工具的簡(jiǎn)單使用介紹,使用Memcheck工具有時(shí)候我們可以很清楚地檢測(cè)出程序存在的一些隱患。其它工具今后有用到的話再做分享,大家感興趣的話可以自行去研究學(xué)習(xí)。
Valgrind交叉編譯
1、下載valgrind源碼包:
wgethttp://valgrind.org/downloads/valgrind-3.14.0.tar.bz2
2、修改valgrind里的configure文件:
把 armv7 * ) 改成 armv7 * |arm)。
3、生成Makefile
./configure--host=arm-linux-gnueabihfCC=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-gccCXX=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-g++--prefix=$PWD/tmp
這個(gè)命令似乎很長(zhǎng),但并不難,只是加了幾個(gè)配置參數(shù)。這些配置參數(shù)怎么看?
我們可以輸入./configure --help命令來(lái)查看支持的配置:
下面我們依次來(lái)分析上面那個(gè)很長(zhǎng)的命令:
--host=arm-linux-gnueabihf:表明了我們最終可執(zhí)行文件運(yùn)行的環(huán)境。
CC=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-gcc:這是指定我們的交叉編譯工具arm-linux-gnueabihf-gcc,這里直接給出絕對(duì)路徑。
CXX=/home/LinuxZn/ToolChain/gcc-arm-linux-gnueabihf-6.2.1/bin/arm-linux-gnueabihf-g++:這是指定我們的交叉編譯工具arm-linux-gnueabihf-g++,這里直接給出絕對(duì)路徑。
--prefix=$PWD/tmp:指定安裝的路徑。表明安裝路徑在當(dāng)前路徑下的tmp文件夾中。
這時(shí)候已經(jīng)生成了Makefile文件:
編譯、安裝:
make makeinstall
安裝完成后tmp文件夾下的內(nèi)容為:
這時(shí)候我們就可以把tmp整個(gè)文件夾拷到板子上使用了。tmp的大小為一百多兆,注意查看板子存儲(chǔ)空間夠不夠:
我們可以配置板子上的valgrind環(huán)境。如果僅是臨時(shí)使用,可以這么用:
tmp/bin/valgrind--tool=memcheck--leak-check=yes./valgrind_test
其中,tmp文件夾與與valgrind_test在同一路徑。這時(shí)候可能會(huì)報(bào)如下錯(cuò)誤:
“valgrind:failedtostarttool‘memcheck’forplatform‘a(chǎn)rm-linux’:Nosuchfileordirectory”
這是因?yàn)関algrind需要依賴其動(dòng)態(tài)庫(kù),而沒有找到動(dòng)態(tài)庫(kù)。因?yàn)槭桥R時(shí)測(cè)試,在valgrind_test路徑輸入如下命令進(jìn)行設(shè)置:
exportVALGRIND_LIB="tmp/lib/valgrind"
這只是在當(dāng)前開發(fā)板終端生效,下次重新進(jìn)入開發(fā)板終端需要重新設(shè)置。
以上就是本次的分享。
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5082文章
19104瀏覽量
304794 -
Linux
+關(guān)注
關(guān)注
87文章
11292瀏覽量
209322 -
源代碼
+關(guān)注
關(guān)注
96文章
2945瀏覽量
66730 -
Valgrind
+關(guān)注
關(guān)注
0文章
9瀏覽量
6807 -
動(dòng)態(tài)檢測(cè)
+關(guān)注
關(guān)注
0文章
2瀏覽量
608
原文標(biāo)題:嵌入式相關(guān)的動(dòng)態(tài)檢測(cè)工具
文章出處:【微信號(hào):良許Linux,微信公眾號(hào):良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論