第22章 Valgrind

Valgrind は、アプリケーションを詳細にわたりプロファイリングするために使用可能な動的分析ツールを構築するインストルメンテーションフレームワークです。デフォルトのインストールには、5 つの標準ツールが含まれます。Valgrind ツールは通常、メモリー管理やスレッドの問題を調査するのに使用します。 Valgrind スイートには、必要に応じて新規プロファイリングツールを構築可能なツールも含まれます。

Valgrind は、初期化されていないメモリーの使用、メモリーの不適切な割り振り/解放、およびシステム呼び出しの不適切な引数などのエラーをチェックするためのユーザー空間バイナリーのインストルメンテーションを提供します。Valgrind のプロファイルツールは、大半のバイナリーで標準ユーザーによる使用が可能ですが、他のプロファイラーと比較すると、Valgrind プロファイルの実行速度は大幅に遅くなります。バイナリーのプロファイルを作成するために、Valgrind は、実行可能ファイルを再作成し、再作成されたバイナリーをインストルメント化します。Valgrind のツールは、ユーザー空間プログラムにおけるメモリー関連の問題を検出する場合に最も役立ちます。ただし、これは、時間固有の問題、カーネルスペースのインストルメンテーションやデバッグには適していません。

Valgrind は、debuginfo パッケージが調査中のプログラムやライブラリー向けにインストールされている場合に、最も有用で正確なレポートを出します。「デバッグ情報を使用したデバッグの有効化」を参照してください。

22.1. Valgrind ツール

Valgrind スイートは、以下のツールで構成されています。

memcheck
このツールは、メモリーからの読み取りおよびメモリーへの書き込みのすべてをチェックし、mallocnewfree および delete へのすべてのシステム呼び出しをインターセプトすることにより、プログラム内のメモリー管理の問題を検出します。他の手段を使ってメモリー管理の問題を検出することは困難であるため、memcheck は最もよく使用される Valgrind ツールと言えるかもしれません。このような問題は長期にわたって検出されないままになることが多く、最終的には診断しにくいクラッシュを生じさせます。
cachegrind
cachegrind は、CPU 内の I1、D1 および L2 キャッシュを緻密にシミュレーションして、コード内のキャッシュミスの原因を正確に指摘するキャッシュプロファイラーです。このプロファイラーは、ソースコードの各行に累積される命令、キャッシュミス数、メモリー参照を表示します。また、cachegrind は関数別、モジュール別、およびプログラム全体の要約や、マシン毎の数を表示することもできます。
callgrind
cachegrind と同様に、callgrind は、キャッシュの動作をモデル化することができます。ただし、callgrind の主な目的は実行したコードのコールグラフデータを記録することです。
massif
massif はヒーププロファイラーでプログラムが使用するヒープメモリーの量を測定し、ヒープブロック、ヒープ管理オーバーヘッド、スタックサイズに関する情報を提供します。ヒーププロファイルは、ヒープメモリーの使用率を減少させる方法を特定する場合に有用です。仮想メモリーを使用するシステムでは、ヒープメモリーの使用率が最適化されたプログラムは、メモリーがなくなることは少なく、必要とするページングの量が少ないため処理も早くなります。
helgrind

POSIX pthreads スレッドプリミティブを使用するプログラムでは、helgrind は、以下のような同期エラーを検出します。

  • POSIX pthreads API の誤用
  • ロックの順序付けの問題から生じる潜在的なデッドロック
  • データレース (ロックが適切でない状態でのメモリーへのアクセス)

Valgrind は、独自のプロファイリングツールを開発することができます。これと合わせて、Valgrind には lackey ツールが含まれており、独自のツールを作成するためのテンプレートとして使用可能なサンプルとして使用できます。

22.2. Valgrind の使用

valgrind パッケージとその依存関係は、Valgrind プロファイルの実行に必要なツールをすべてインストールします。Valgrind でプログラムをプロファイリングするには、以下を使用します。

~]$ valgrind --tool=toolname program

toolname の引数の一覧については、「Valgrind ツール」を参照してください。Valgrind ツールスイート以外に、toolname では none も有効な引数として使用できます。この引数では、プロファイリングせずに Valgrind でプログラムを実行できます。Valgrind 自体のデバッグやベンチマーク化をする時に、これは便利です。

Valgrind に、固有のファイルに情報すべてを送信するように指示することも可能です。これには、--log-file=filename のオプションを使用します。実行可能ファイル hello のメモリー使用状況を確認して、output にプロファイル情報を送信するには、以下を使用します。

~]$ valgrind --tool=memcheck --log-file=output hello

Valgrind に関する詳しい情報は、「追加情報」や、ツールの Valgrind スイートに関する他のドキュメントを参照してください。

22.3. 追加情報

Valgrind の詳細情報は、man valgrind を参照してください。Red Hat Enterprise Linux には、包括的な Valgrind ドキュメント が PDF および HTML 形式で含まれています。これらのドキュメントは以下の場所にあります。

  • /usr/share/doc/valgrind-version/valgrind_manual.pdf
  • /usr/share/doc/valgrind-version/html/index.html