なぜvalgrindは大事か?(http://mqiita.com/yusa_a/items/3d904919457d770b486a)
Valgrind実行の仕組み
-
Valgrindコアが提供する合成CPU上で実行
-
コアは選択されたツールにコードを渡す
-
ツールは独自のインストルメンテーション(追加機能(プローブ)を挿入する技術)コードを追加し、その結果をコアに返します
インストルメンテーションコード -> 単純なコード量が増えるため実行速度が遅い。 -
コアは、インストルメントされたコードの継続的な実行を調ベる
プログラムが実行するすべての命令(掘れる限り)をシミュレートします
! エラーは報告された順に修正
1block = 1malloc
--leak-check : 詳細なメモリリーク検出機能がオン
--num-callers : スタックトレース(問題が発生した場所を示す)を大きくする
Conditional jump or move depends on uninitialised value(s)
->
--track-origins=yes : 初期化されていない値がどこから来ているのかを突き止める
-g : 関連するソースコード行を直接示す
-v : さらに詳しい情報
-Wall : 見逃す可能性のある問題の一部またはすべてを識別
--trace-children=yes : 用しているインタープリタに関するエラーレポートを非表示
--log-file=filename : 指定したファイルに書き込む
C++
-fno-inline : 関数呼び出しチェーンが見やすい
--read-inline-info=yes : インライン展開情報を記述したデバッグ情報
検知category
Valgrind の検知カテゴリ
メモリリーク関連
definitely lost
→ 参照が完全に失われたメモリ。確実なリーク。
indirectly lost
→ 参照元が lost になって巻き添えを食ったメモリ。
possibly lost
→ ポインタは残っているけど正しく参照できるかわからない。
still reachable
→ 解放されていないが、参照できるポインタが残っている。リークとはみなさない。
無効なメモリアクセス
Invalid read / Invalid write
→ malloc/free 領域の外を読んだり書いたりしている。
Use of uninitialized value
→ 値を設定していない変数を使った。
Conditional jump or move depends on uninitialised value(s)
→ 未初期化変数に基づいて if 分岐や演算をしている。
不正な free / 管理ミス
Invalid free() / delete / delete[]
→ malloc していない領域を free した、あるいは二重 free した。
Mismatched free() / delete
→ malloc した領域を delete したなど。
ファイルディスクリプタやスレッド系
Still open file descriptors
→ プログラム終了時に閉じてない FD がある。
Threading errors(Helgrind/DRDを使うと検知)
→ データ競合、ロックミスなど。