valgrind manual 2
2.1
valgrindは実行時にそれぞれのツールがコードを挿入して実行する。
nativeコードより数倍遅くなる
2.2
debug modeでコンパイルした方が正確な情報が出る
最適化オプションをつけると動作がおかしくなることもまれにある
-wallオプションをつけるのもいいかも
shellやperlからプログラムが呼び出される場合、shellを書き直してvalgrindが直接実行ファイルにアクセスするようにする。
そうでない場合には--trace-children=yesをつければ、呼び出してるプログラムのエラーも拾えるが、避けた方が無難。
2.3
コメントの書式
==processid== コメント
デフォルトでは重要なコメントしかこない。
他の情報も欲しい場合は-v オプションをつける
メッセージの出力先
default 標準エラー出力
--log-fd=9: 出力先をファイル記述子で9番に指定されているところへ
--log-file=filename: filenameというファイルに出力
--log-socket=192.168.0.1:12345 IPアドレスとポート番号でネットワークソケットを指定して出力
エラーはコメントとして出力されるけど、プロファイルの結果はツールによって出力先が異なるから気をつけること。
エラーはサイズ小さいし、人が読んで有益だけど、プロファイルはデータがでかいし、深く読まないと役立てられないしね。
2.4
エラーの例
==25832== Invalid read of size 4 ==25832== at 0x8048724: BandMatrix::ReSize(int, int, int) (bogon.cpp:45) ==25832== by 0x80487AF: main (bogon.cpp:66) ==25832== Address 0xBFFFF74C is not stack'd, malloc'd or free'd
Memcheckの出力例。
アドレス0xBFFFF74Cで4バイトのエラーリード。bogon.cppの45行。bogon.cppの66行から呼び出され。
重複するエラーは出力しない。
-vおぷしょんでエラーの回数なども詳細に表示
報告された順にエラーを直すのが賢い
1000個の異なるエラーを発見するか合計で10,000,000個のエラーが発見されたら中止する。計算時間の都合もあって。
m_errormgr.cで調整可能
--error-limit=noオプションでリミットを外せる
2.5suppressing error
直せないエラー(OSの内部とか、関係ない部分のエラー)を表示させなくする。
./configureで設定されている。
--gen-suppressions=yesオプションで追加できる(自動でsuppressするものが追加される)。
--27579-- supp: 1 socketcall.connect(serv_addr)/__libc_connect/__nscd_getgrgid_r
--27579-- supp: 1 socketcall.connect(serv_addr)/__libc_connect/__nscd_getpwuid_r
--27579-- supp: 6 strrchr/_dl_map_object_from_fd/_dl_map_object
suppressの例。suppressされたものと回数。
デフォルトでは$PREFIX/lib/valgrind/default.suppから呼び出される
--suprressions=/path/to/file.suppで指定できる
省略
2.6core command-line options
--tool~<toolname>[default: memcheck]
ツールの選択
--help, -h
ヘルプを表示
--help-debug
--helpと一緒。デバッグオプションも表示する
--version
valgrindのバージョンを表示
-q, --quiet
サイレントに走らせて、エラーメッセージだけを表示させる。
-v, --verbose
詳細な情報を表示
--trace-children=<yes|no>[default:no]
execシステムコールで呼ばれたsub-processのエラーまで追跡。マルチプロセスのプログラミングでは必須。
--trace-children-skip=pattern1,pattern2
patternのprocessの追跡をやめる。プロセスで作られる木構造の枝刈をするイメージで、それより下のプロセスも追跡しなくなる。
--child-silent-after-fork~<yes|no>[default:no]
forkによる子プロセスのデバッグやログの出力を表示しない。
XMLオプションを使うときにおすすめ
--track-fds=<yes|no>[default:no]
ファイルディスクリプタのリストを表示
--time-stamp=<yes|no>[default:no]
経過時間をwallclockで表示
--log-fd=<number>[default:2]
messeageを送るファイルディスクリプタ番号を指定
--log-file=<filename>
出力ファイルを指定。
%pはプロセスIDと置換される。マルチプロセスで効果あり。
%q{foo}環境変数fooと置換される。MPIプログラムを走らせてる時などに有効。例えばBPROC_RANKなど。エスケープシーケンスが必要なこともある
%%は%と置換される
--log-socket=<ip-address:port-number>
2.6.3 errorかんれんのオプション
--xml=<yes|no>
xmlけいしきでエラーメッセージ等が出力される。
--xml_fd=<number> default:1
xmlを送るファイルディスクリプタを指定
--xml-file=<filename>
xmlを送るファイル名を指定
--xml-socket<ip-address:port-number>
xmlを送るネットワークソケット
--xml-user-comment=<string>
xmlファイルの先頭にコメントを挿入
--demangle=<yes|no>default: yes
demangling C++ name
--num-callers=<number>[default:12]
stack traceのエントリーの最大数を制限。50まで指定可
--error-limit=<yes|no> [default yes]
エラーの数にりみっとをかける。デフォルト10,000,000エラーか1,000種類
--error-exitcode=<number> [default: 0]
エラーが出たときの終了コードを設定する
--show-below-main=<yes|no>[default:no]
よくわからん
--fullpath-after=<string>[default: don't show source paths]
中略
2.7