http://valgrind.org/docs/manual/manual.htmlphp
l Valgrind查找內存泄露利器html Valgrind是一個GPL的軟件,用於Linux(For x86, amd64 and ppc32)程序的內存調試和代碼剖析。你能夠在它的環境中運行你的程序來監視內存的使用狀況,好比C 語言中的malloc和free或者 C++中的new和 delete。使用Valgrind的工具包,你能夠自動的檢測許多內存管理和線程的bug,避免花費太多的時間在bug尋找上,使得你的程序更加穩固。前端 l Valgrind的主要功能 l Memcheck 工具主要檢查下面的程序錯誤:算法 使用未初始化的內存 (Use of uninitialised memory) l Callgrind數組 Callgrind收集程序運行時的一些數據,函數調用關係等信息,還能夠有選擇地進行cache模擬。在運行結束時,它會把分析數據寫入一個文件。callgrind_annotate能夠把這個文件的內容轉化成可讀的形式。緩存 l Cachegrind網絡 它模擬 CPU中的一級緩存I1,D1和L2二級緩存,可以精確地指出程序中 cache的丟失和命中。若是須要,它還可以爲咱們提供cache丟失次數,內存引用次數,以及每行代碼,每一個函數,每一個模塊,整個程序產生的指令數。這對優化程序有很大的幫助。多線程 l Helgrind 它主要用來檢查多線程程序中出現的競爭問題。Helgrind尋找內存中被多個線程訪問,而又沒有一向加鎖的區域,這些區域每每是線程之間失去同步的地方,並且會致使難以發掘的錯誤。Helgrind實現了名爲」 Eraser」 的競爭檢測算法,並作了進一步改進,減小了報告錯誤的次數。 l Massif 堆棧分析器,它能測量程序在堆棧中使用了多少內存,告訴咱們堆塊,堆管理塊和棧的大小。 Massif能幫助咱們減小內存的使用,在帶有虛擬內存的現代系統中,它還可以加速咱們程序的運行,減小程序停留在交換區中的概率。 |
http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2
1. tar -jxvf valgrind-3.12.0.tar.bz2
2. cd valgrind-3.12.0
3. ./configure
… config.status: creating config.h config.status: executing depfiles commands
Maximum build arch: amd64 Primary build arch: amd64 Secondary build arch: Build OS: linux Primary build target: AMD64_LINUX Secondary build target: Platform variant: vanilla Primary -DVGPV string: -DVGPV_amd64_linux_vanilla=1 Default supp files: exp-sgcheck.supp xfree-3.supp xfree-4.supp glibc-2.X-drd.supp glibc-2.34567-NPTL-helgrind.supp glibc-2.X.supp |
4. make
5. make install
輸入valgrind–h顯示valgrind的參數及提示,說明安裝成功
1.檢查內存錯誤: 其中--leak-check=full指的是徹底檢查內存泄漏,--show-reachable=yes是顯示內存泄漏的地點,--trace-children=yes是跟入子進程。 若是您的程序是會正常退出的程序,那麼當程序退出的時候valgrind天然會輸出內存泄漏的信息。若是您的程序是個守護進程,那麼也沒關係,咱們 只要在別的終端下殺死memcheck進程(由於valgrind默認使用memcheck工具,就是默認參數—tools=memcheck): 2,檢查代碼覆蓋和性能瓶頸: 會在當前路徑下生成callgrind.out.pid(當前生產的是callgrind.out.19689),若是咱們想結束程序,能夠: |
參數解釋:
名字: 概要用法: 概述: 用法: 這樣將在Valgrind使用Memcheck運行程序program(帶有參數args)。內存檢查 可用--tool指定使用其它工具: 可以使用的工具以下: o callgrind在cachegrind基礎上添加調用追蹤。它能夠用來獲得調用的次數 o helgrind可以發現程序中潛在的條件競爭。 o lackey是一個示例程序,以其爲模版能夠建立你本身的工具。在程序結束後, o massif是一個堆剖析器,它測量你的程序使用了多少堆內存。 o memcheck是一個細粒度的的內存檢查器。 o none沒有任何功能。它它通常用於Valgrind的調試和基準測試。 基本選項: -h --help --help-debug --version -q --quiet -v --verbose -d 調試Valgrind自身發出的信息。一般只有Valgrind開發人員對此感興趣。 --tool= [default: memcheck] --trace-children= [default: no] --track-fds= [default: no]
--log-fd= [default: 2, stderr] --log-file= --log-file-exactly= --log-file-qualifier= --log-socket=
--xml= [default: no] --xml-user-comment= --demangle= [default: yes] 一個關於名字編碼解碼重要的事實是,禁止文件中的解碼函數名仍然使用 --num-callers= [default: 12] 這個值的最大值是50。注意高的設置會使Valgrind運行得慢,而且使用更多 --error-limit= [default: yes] --error-exitcode= [default: 0] --show-below-main= [default: no] --suppressions= [default: $PREFIX/lib/valgrind/default.supp] --gen-suppressions= [default: no]
若是選擇是,Valgrind會打印出一個錯誤的禁止條目,你能夠把它剪切而後 當設置爲all時,Valgrind會對每個錯誤打印一條禁止條目,而不向用戶 這個選項對C++程序很是有用,它打印出編譯器調整過的名字。 注意打印出來的禁止條目是儘量的特定的。若是須要把相似的條目概括 --db-attach= [default: no] ---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ---- 按下回車,或者N、回車,n、回車,Valgrind不會對這個錯誤啓動調試器。 按下Y、回車,或者y、回車,Valgrind會啓動調試器並設定在程序運行的 按下C、回車,或者c、回車,Valgrind不會啓動一個調試器,而且不會再 注意:--db-attach=yes與--trace-children=yes有衝突。你不能同時使用 2002.05:這是一個歷史的遺留物,若是這個問題影響到你,請發送郵件並 2002.11:若是你發送輸出到日誌文件或者到網絡端口,我猜這不會讓你有 --db-command= [default: gdb -nw %f %p] 這指定了Valgrind將怎樣調用調試器。默認選項不會由於在構造時是否檢 給出的這個命令字串能夠包括一個或多個%p %f擴展。每個%p實例都被 --input-fd= [default: 0, stdin] --max-stackframe= [default: 2000000] 若是在程序中有大量的棧分配的數組,你可能須要使用這個選項。 應該只在Valgrind的調試輸出中顯示須要這麼作時才使用這個選項。在這 廣泛地,在棧中分配大塊的內存是一個壞的主意。由於這很容易用光你的 |
工做原理簡介:
valgrind被設計成非侵入式的,它直接工做於可執行文件上,所以在檢查前不須要從新編譯、鏈接和修改你的程序。要檢查一個程序很簡單,只須要執行下面的命令就能夠了
valgrind --tool=tool_name program_name
好比咱們要對ls -l命令作內存檢查,只須要執行下面的命令就能夠了
valgrind --tool=memcheck ls -l
無論是使用哪一個工具,valgrind在開始以前總會先取得對你的程序的控制權,從可執行關聯庫裏讀取調試信息。而後在valgrind核心提供的 虛擬CPU上運行程序,valgrind會根據選擇的工具來處理代碼,該工具會向代碼中加入檢測代碼,並把這些代碼做爲最終代碼返回給valgrind核 心,最後valgrind核心運行這些代碼。
不一樣工具間加入的代碼變化很是的大。在每一個做用域的末尾,memcheck加入代碼檢查每一片內存的訪問和進行值計算,代碼大小至少增長12倍,運行速度要比平時慢25到50倍。
valgrind模擬程序中的每一條指令執行,所以,檢查工具和剖析工具不只僅是對你的應用程序,還有對共享庫,GNU C庫,X的客戶端庫都起做用。
|
分析輸出的調試信息 ==3908== Memcheck, a memory error detector. ==3908== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al. ==3908== Using LibVEX rev 1732, a library for dynamic binary translation. ==3908== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP. ==3908== Using valgrind-3.2.3, a dynamic binary instrumentation framework. ==3908== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al. ==3908== For more details, rerun with: -v ==3908== --3908-- DWARF2 CFI reader: unhandled CFI instruction 0:50 --3908-- DWARF2 CFI reader: unhandled CFI instruction 0:50 /*數組越界錯誤*/ ==3908== Invalid write of size 4 ==3908== at 0x8048384: f (test.c:6) ==3908== by 0x80483AC: main (test.c:11) ==3908== Address 0x400C050 is 0 bytes after a block of size 40 alloc'd ==3908== at 0x40046F2: malloc (vg_replace_malloc.c:149) ==3908== by 0x8048377: f (test.c:5) ==3908== by 0x80483AC: main (test.c:11) ==3908== ==3908== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 14 from 1) ==3908== malloc/free: in use at exit: 40 bytes in 1 blocks. ==3908== malloc/free: 1 allocs, 0 frees, 40 bytes allocated. ==3908== For counts of detected errors, rerun with: -v ==3908== searching for pointers to 1 not-freed blocks. ==3908== checked 59,124 bytes. ==3908== ==3908== /*有內存空間沒有釋放*/ ==3908== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1 ==3908== at 0x40046F2: malloc (vg_replace_malloc.c:149) ==3908== by 0x8048377: f (test.c:5) ==3908== by 0x80483AC: main (test.c:11) ==3908== ==3908== LEAK SUMMARY: ==3908== definitely lost: 40 bytes in 1 blocks. ==3908== possibly lost: 0 bytes in 0 blocks. ==3908== still reachable: 0 bytes in 0 blocks. ==3908== suppressed: 0 bytes in 0 blocks |