第22章 Valgrind

Valgrind は、アプリケーションを詳細にわたりプロファイリングするために使用可能な動的分析ツールを構築するインストルメンテーションフレームワークです。デフォルトのインストールには、5 つの標準ツールが含まれます。Valgrind ツールは通常、メモリー管理やスレッドの問題を調査するのに使用します。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 ツールのスイート以外に、nonetoolname の有効な引数になります。この引数を使用すると、プロファイルを実行せずにプログラムを 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

このページには機械翻訳が使用されている場合があります (詳細はこちら)。