第22章 Valgrind
Valgrind は、アプリケーションを詳細にわたりプロファイリングするために使用可能な動的分析ツールを構築するインストルメンテーションフレームワークです。デフォルトのインストールには、5 つの標準ツールが含まれます。Valgrind ツールは通常、メモリー管理やスレッドの問題を調査するのに使用します。Valgrind は、初期化されていないメモリーの使用、メモリーの不適切な割り振り/解放、およびシステム呼び出しの不適切な引数などのエラーをチェックするためのユーザー空間バイナリーのインストルメンテーションを提供します。Valgrind のプロファイルツールは、大半のバイナリーで標準ユーザーによる使用が可能ですが、他のプロファイラーと比較すると、Valgrind プロファイルの実行速度は大幅に遅くなります。バイナリーのプロファイルには、Valgrind は特別な仮想マシン内でこのツールを実行することで、Valgrind が全バイナリーの命令を傍受できるようになります。Valgrind のツールは、ユーザー空間プログラムにおけるメモリー関連の問題を検出する場合に最も役立ちます。 ただし、これは、時間固有の問題、カーネルスペースのインストルメンテーションやデバッグには適していません。
Valgrind は、調査中のプログラムやライブラリー向けに debuginfo パッケージがインストールされている場合に、最も有用で正確なレポートを提供します。「デバッグ情報を使用したデバッグの有効化」 を参照してください。
22.1. Valgrind ツール
Valgrind スイートは、以下のツールで設定されています。
特定のツールが選択されていない場合における、デフォルトのツールとしての memcheck 関数。
- cachegrind
- cachegrind は、CPU で I1、D1、および L2 キャッシュの詳細なシミュレーションを実行することで、コード内のキャッシュミスのソースを正確に特定するキャッシュプロファイルです。このプロファイラーは、ソースコードの各行に累積される命令、キャッシュミス数、メモリー参照を表示します。 また、cachegrind は関数別、モジュール別、およびプログラム全体の要約や、マシン毎の命令についての数を表示することもできます。
- callgrind
-
cachegrind
と同様に、callgrind
はキャッシュ動作をモデル化できます。ただし、callgrind
の主な目的は実行したコードのコールグラフデータを記録することです。 - massif
- massif はヒーププロファイラーです。これは、プログラムが使用するヒープメモリーを測定し、ヒープブロック、ヒープ管理のオーバーヘッドおよびスタックのサイズに関する情報を提供します。ヒーププロファイルは、ヒープメモリーの使用を縮小する方法を特定する場合に有用です。仮想メモリーを使用するシステムでは、ヒープメモリーの使用率が最適化されたプログラムは、メモリーが不足することは少なくなり、必要とするページングの量が少なくなるために処理も速くなります。
- helgrind
POSIX pthreads スレッドのプリミティブを使用するプログラムでは、helgrind は同期エラーを検出します。以下は、このようなエラーに該当します。
- POSIX pthreads API の誤用
- ロックの順序付けの問題から生じる潜在的なデッドロック
- データレース (ロックが適切でない状態でのメモリーへのアクセス)