Valgrind manual:
http://valgrind.org/docs/manual/manual.html
valgrind介紹:
l Valgrind查找內存泄露利器 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能幫助我們減少內存的使用,在帶有虛擬內存的現代系統中,它還能夠加速我們程序的運行,減少程序停留在交換區中的機率。 |
valgrind下載:
http://valgrind.org/downloads/valgrind-3.12.0.tar.bz2
valgrind安裝:
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的參數及提示,說明安裝成功
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
|
轉自:https://blog.csdn.net/justheretobe/article/details/52986461