第22章 Valgrind

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

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

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

22.1. Valgrind ツール

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

memcheck

このツールは、プログラムでメモリー管理の問題を以下ように検出します。

  • メモリーへの読み込みと書き込みをすべて確認
  • mallocfreenew、または 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