Valgrind使用簡単説明(ZZ)


調整できないメモリが漏れて、使いきれないValgrind(プログラムのデバッグを紹介する素晴らしい説明:http://www.ibm.com/developerworks/cn/linux/l-pow-debug/)
Valgrind紹介
Valgrindは、GPLのソフトウェアで、Linux(For x 86、amd 64 and ppc 32)プログラムのメモリデバッグとコード解析に使用されます.メモリの使用状況を監視するためにその環境でプログラムを実行してもいいです.例えば、C言語のmalloやfreeやC++のnewやdeleteなどです.Valgrindのツールバッグを使って、あなたは自動的に多くのメモリ管理とスレッドのbugを検出することができて、多すぎる時間をbugで探すことを免れて、あなたのプログラムを更に安定させます.
Valgrindの主な機能
Valgrindツールバッグには、Memcheck、Cachecgrind、Helgrind、Callgrind、Massifなどの複数のツールが含まれています.ツールの役割を説明します.
Memcheckツールは主に以下のプログラムエラーをチェックします.
初期化されていないメモリ(Use of uninitiased memory)を使用します.
リリースしたメモリ(Reading/writing memory after it has been free’d)を使用します.
mallo割り当てを超えたメモリ空間(Reading/writing off the end of mallo’d blocks)を使用する.
スタックへの不正アクセス(Reading/writing inapprate aras on the stack)
申請の空間は解放されていますか?(Memory leaks–where pointers to mallo’d blocks are lost forever)
mallec/free/new/delete申請とリリースメモリのマッチング(Mismached of mallc/new/new[]vs free/delete/delete[])
srcとdstの重なり(Overlapping src and dst pointers in memcpy()and related functions)
Callgrind
Callgrindはプログラムの実行時のデータを収集して、関数の呼び出し関係などの情報、また選択的にcacheシミュレーションを行うことができます.運転終了時に分析データをファイルに書き込みます.calgrind_annotateはこのファイルの内容を読み取り可能な形式に変換することができます.
Cachecgrind
これはCPU中の一級キャッシュI 1,D 1,L 2の二段キャッシュをシミュレートし、プログラム中のcacheの紛失と命中を正確に指摘することができる.必要であれば、cacheの失われた回数、メモリ参照回数、および各ラインのコード、各モジュール、プログラム全体によって生成される命令数を提供することもできます.これは最適化の手順に大きな助けがあります.
Helgrind
これは主にマルチスレッドプログラムに発生する競合問題を調べるために用いられる.Helgrindはメモリの中で複数のスレッドにアクセスされ、また一貫してロックされていない領域を探しています.これらの領域はしばしばスレッド間の同期が失われているところであり、発見が困難なエラーを招きます.Helgrindは「Easer」という競争検出アルゴリズムを実現し、さらに改善し、報告ミスの数を減らしました.
Massif
スタックアナライザは、プログラムがスタックにどれぐらいのメモリを使っているかを測定できます.ブロック、スタック管理ブロック、スタックのサイズを教えてくれます.Massifはメモリの使用を減らすことを助けてくれます.仮想メモリを持つ現代システムでは、プログラムの実行を加速して、プログラムがスワップエリアにとどまる確率を減らすことができます.
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 valgrind-3.2.3
5、 ./configure
6、 Make;make install
Valgrind使用
使い方:valgrind[options]prog-and-args[options]:一般的なオプションは、すべてのValgrindツールに適用されます.
-tool=一番よく使われているオプションです.実行
valgrindの中でtoolnameというツールです.デフォルトのmemcheck
h–helpはヘルプ情報を表示します.
-version表示
valgrindカーネルのバージョンは、各ツールにそれぞれバージョンがあります.
q–quietは静かに運転し、エラー情報のみを印刷します.
v–verboseより詳細な情報は、エラー数統計を追加します.
-trace-children=no yesトラッキング子スレッド?[ノ]
-track-fds=no yesが開いているファイルの説明を追跡しますか?[ノ]
-time-stamp=no yesタイムスタンプをLOG情報に追加しますか?[ノ]
-log-fd=記述子ファイルにLOGを出力する[2=stder]
-log-file=出力した情報をfilename.PIDのファイルに書き込み、PIDは実行プログラムの実行IDです.
-log-file-exactly=fileにLOG情報を出力します.
-log-file-qualifer=は環境変数の値を取得して情報を出力するファイル名とします.[none]
-log-socket=ipad ddr:port出力LOGからsocket、ipad ddr:port
LOG情報出力
-xml=yesは情報をxml形式で出力します.memcheckだけが利用できます.
-num-calers=showcalers in stack traces[12]
-error-limit=no yesエラーが多すぎると、新しいエラーの表示を停止しますか?[yes]
-error-exitcode=エラーが発生したらエラーコード[0=disable]に戻ります.
-db-atach=no yesがエラーが発生した場合、
valgrindは自動的にパイロットgdbを起動します.[ノ]
-db-command=デバッタを起動するコマンドラインオプション[gdb-nw%f%p]
Memcheckツールに適用する関連オプション:
-leak-check=no summary fullはleakに対して詳細な情報を要求しますか?[summary]
-leak-resolution=low med|highow much bt merging in leak check[low]
-show-reachable=no yes show reachable blocks in leak check?[ノ]
Valgrind使用例
次は問題があるCプログラムのコードtest.cです.
#include <stdlib.h>
void f(void)
{
int* x = malloc(10 * sizeof(int));
x[10] = 0; // 1:
} // 2:
int main(void)
{
f();
return 0;
}
1、     test.c
gcc -Wall test.c -g -o test
2、 Valgrind BUG
valgrind --tool=memcheck --leak-check=full ./test
3、
==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.