第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 ツールが含まれており、このつーる は独自のツールを作成するためのテンプレートとして使用可能なサンプルとして使用できます。


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