Valgrind
開発元 ⇒The Valgrind Developers
最新版3.3.0 / 2007年12月11日
対応OSクロスプラットフォーム
種別プロファイラ、メモリデバッガ
ライセンスGNU General Public License
公式サイト ⇒http://valgrind.org/
表・話・編・歴
Valgrind は、メモリデバッグや、メモリリークの検出、プロファイリングを行うためのプログラミングツールである。Valgrind という名前は、北欧神話におけるヴァルハラへの入り口の名に由来している[1]。
Valgrind は元々x86上のLinux用のフリーのメモリデバッグツールとして設計されたが、開発が進んだ結果、チェッカーやプロファイラといった動的解析ツールのための汎用のフレームワークとなっている。Valgrind は多数の Linux 関連のプロジェクトで使用されている[2]。
Valgrind の元々の開発者は、 ⇒Julian Seward であり、彼は 2006 年に Valgrind に関する功績でGoogle-O'Reilly Open Source Award を受賞した[3][4]。彼以外の開発者も重要な貢献を行っており、Cerion Armour-Brown, Jeremy Fitzhardinge, Tom Hughes, Nicholas Nethercote, Paul Mackerras, Dirk Mueller, Josef Weidendorfer and Robert Walsh などが挙げられる。Valgrind は GNU General Public License の元でリリースされているフリーソフトウェアである。
目次
1 概要
2 ツール
3 サポートされているプラットフォーム
4 制約
5 参考文献
6 脚注
7 外部リンク
//
Valgrind は、本質的にはJIT コンパイル(バイナリ変換) の技術を用いた仮想マシンである。元々のプログラムそのものがホストのプロセッサで直接実行されることはない。代わりに、Valgrind はまずプログラムをIRと呼ばれるのシンプルな中間形態に変換する。 これはプロセッサ非依存であり、SSA ベースの中間表現である。 変換の後、Valgrind が IR をマシンコードに再度変換してホストプロセッサに実行させる前に、「ツール」(下記参照)は IR に対して自由に操作を行うことができる。かなりのパフォーマンスがこれらの変換の過程(およびツールが挿入するコード)で損なわれ、プログラムは Valgrind 上では(全くツールを使用しない場合でも)通常より 4-5 倍低速に動作する。しかし、IR の形態は計測には非常に適している。これによりツールの開発が簡単になり、大半のプロジェクトでは、デバッグ中のこの程度の性能の低下は大きな問題ではない。
多数のツールが Valgrind に含まれている(また、外部から提供されているものもある)。標準であり、最もよく利用されているツールは Memcheck である。Memcheck はほぼ全ての命令に特別な ⇒計測用のコードを挿入し、「正当性」 (初期化が行われるまでは、割り当て済みでないメモリは全て無効であるか、未定義である)があり、「アドレス可能」(メモリアドレスが割り当て済みで、解放されていないメモリブロックを指している)であるかという情報が、それぞれ V ビット および A ビット に格納されているかを追跡する。データは移動したり加工されたりするが、計測用のコードは1ビットレベルで正確であるように A, V ビットを追跡する。対照的に、他のメモリチェックツール( ⇒IBM Rational Purify)などは未初期化メモリのコピーの検出のみ行う(ただし、必ずしも問題があるわけではない)。
さらに、Memcheck は標準の C メモリアロケータを、全ての割り当て済みブロック(無効に設定された A ビットを持っている)に memory guards を挿入可能な独自の実装に置き換える。この機能により、Memcheck はプログラムが割り当てられたブロックよりわずかに外側の領域を読み書きする ⇒off-by-one エラーを検出できる(この問題に対する別の対応策として、コンパイラに ⇒境界を持ったポインタを実装し、特にヒープではなくスタックに確保されたメモリのメモリエラーの検出漏れを低減させる方法があるが、計測するバイナリコードを全てリコンパイルする必要がある)。Memcheck が検出や警告可能な問題には下記のものがある。
初期化されていないメモリの使用
freeされたメモリの読み書き
mallocされたブロックの終端以降への読み書き
メモリリーク
こうした機能への代償として性能が低下する。Memcheck の元で動作するプログラムは Valgrind なしで動作する場合と比べて 5倍から20倍遅く、より多くのメモリを使用する(メモリ確保ごとにかなりのメモリを追加で消費する)。したがって、ほとんどの開発者は常に Memcheck (あるいは他の Valgrind ツール)の元でコードを走らせることはしない。特定のバグを解析したり、(Memcheck が検出可能な種類の)潜在的なバグがないことを検証するために使用するのが最も典型的な方法である。
Memcheck 以外に、Valgrind には下記のツールがある。
Addrcheck:Memcheck の軽量版であり、少ないメモリ消費で高速に動作するが、少ないメモリの問題しか検出できない。このツールはバージョン 3.2.0 の時点で削除されている。
Massif:ヒーププロファイラ
Helgrind :マルチスレッドのコードにおける競合状態を検出可能なツール
Cachegrind: キャッシュプロファイラであり、グラフィカルユーザインタフェースのKCacheGrindを含む
これ以外に、外部で開発されたいくつかのツールが利用できる。
バージョン 3.3.0 の時点で、Valgrind はx86、x86-64 および PowerPCの Linux をサポートしている。