5.3. Valgrind を使ったメモリ使用量のプロファイリング
Valgrind は、ユーザースペースバイナリーへのインストルメンテーションを提供するフレームワークです。プログラムパフォーマンスのプロファイリングや分析に使用可能な数多くのツールと出荷されます。このセクションで紹介されるツールは、初期化されていないメモリの使用やメモリの不適切な割り当てや解放などのメモリエラーの検出に役立つ分析を提供します。これらはすべて valgrind に含まれており、以下のコマンドで実行可能です。
valgrind --tool=toolname program
toolname を使用するツール名で置き換え (メモリのプロファイリングには、
memcheck
、massif
、cachegrind
のいずれか)、program を Valgrind でプロファイリングするプログラム名に置き換えます。Valgrind のインストルメンテーションを使うと、プログラムの実行が通常よりも遅くなることに留意してください。
Valgrind の機能の概要は 「Valgrind」 で説明されています。Eclipse 用に利用可能なプラグインについての情報を含む詳細は、『開発者ガイド』 を参照してください。http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/から入手できます。付随資料は valgrind パッケージのインストール時に
man valgrind
コマンドで表示するか、以下の場所で見つけられます。
/usr/share/doc/valgrind-version/valgrind_manual.pdf
/usr/share/doc/valgrind-version/html/index.html
5.3.1. Memcheck を使ったメモリ使用量のプロファイリング
Memcheck はデフォルトの Valgrind ツールで、
valgrind program
で --tool=memcheck
指定せずに実行できます。本来発生すべきでないメモリアクセスや未定義もしくは初期化されていない値の使用、誤って解放されたヒープメモリ、重複するポインター、メモリリークなどの検出や診断が難しい多くのメモリエラーを検出し、それらについてレポートします。Memcheck を使うと、プログラムは通常の実行時に比べて、10-30 倍の時間がかかります。
Memcheck は、検出する問題の種類により、特定のエラーを返します。これらのエラーは、
/usr/share/doc/valgrind-version/valgrind_manual.pdf
に含まれている Valgrind の資料に詳細が説明されています。
Memcheck が実行できるのは、これらのエラーのレポートだけで、エラー発生を防止できるわけではないことに注意してください。通常はセグメント化障害につながる方法でプログラムがメモリにアクセスする場合、このセグメント化障害は発生し続けますが、Memcheck はこの障害のすぐ前にエラーメッセージをログ記録します。
Memcheck はチェックプロセスにフォーカスできるコマンドラインオプションを提供します。以下に例を挙げます。
--leak-check
- これを有効にすると、Memcheck はクライアントプログラムの完了時にメモリリークを検索します。デフォルト値は
summary
で、これは発見されたリーク数を出力します。使用可能な他の値はyes
とfull
で、両方とも個別リークの詳細を提供します。また、no
を使用すると、メモリリークチェックが無効になります。 --undef-value-errors
- これを有効にすると (
yes
に設定)、Memcheck は未定義の値が使用された際にレポートします。無効にすると (no
に設定)、未定義の値エラーはレポートされません。デフォルトでは有効になっており、無効にすると Memcheck スピードが若干高まります。 --ignore-ranges
- Memcheck がアドレス指定能力をチェックする際に無視する 1 つ以上の範囲をユーザーが指定できるようになります。複数の範囲は以下のようにコンマで区切ります。
--ignore-ranges=0xPP-0xQQ,0xRR-0xSS
オプションの全一覧は、
/usr/share/doc/valgrind-version/valgrind_manual.pdf
にある資料を参照してください。