Valgrind

Valgrindの最新ニュースをまとめて検索!

Valgrind
開発元 The Valgrind Developers
最新版 3.5.0 (2009年8月19日)
対応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 の元でリリースされているフリーソフトウェアである。

目次

[編集] 概要

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 はx86x86-64 および PowerPCの Linux をサポートしている。ただし、Unix 系プラットフォームへの非公式な移植版が存在する(FreeBSD[5] や、NetBSD[6]Mac OS X[7]など)。

Microsoft Windows向けの移植版は現時点では存在しない(また、短期的にも公式な計画はない)が、Linux 上で動作する Windows ソフトウェアをデバッグするため Wine と接続することができる実験的なバージョンが存在する。プラットフォームのサポートを増やすことは長期的な目標であるが、プロジェクトの性質から非常に多くの作業を必要とする。

[編集] 制約

パフォーマンスのペナルティに加えて、Valgrind の重大な制約事項は、静的なデータやスタックを使用した場合に境界違反を検出することができない点である[8]。下記のコードは コメントに示すようなエラーが存在するにもかかわらず Valgrind の Memcheck ツールで合格となる。

  int Static[5];
 
  int main(void)
  {
    int Stack[5];
 
    Static[5] = 0;  /* boom! Static[0] to Static[4] exist, Static[5] is out of bounds */
    Stack [5] = 0;  /* bang!  Stack[0] to  Stack[4] exist,  Stack[5] is out of bounds */
 
    return 0;
  }

この種類のエラーが検出できないことは、ソフトウェアが、バッファオーバーランを生じた場合、古典的なスタック破壊の脆弱性攻撃に対してセキュリティホールになりうるため、注目すべき点である。

[編集] 参考文献

[編集] 脚注

  1. ^ Valgrind FAQ
  2. ^ valgrind.org's list of users
  3. ^ valgrind.org's list of awards
  4. ^ Google-O'Reilly Open Source Awards - Hall of Fame
  5. ^ Valgrind FreeBSD port
  6. ^ Valgrind NetBSD port
  7. ^ Valgrind Mac OS X port
  8. ^ Valgrind FAQ

[編集] 外部リンク

最終更新 2009年10月31日 (土) 06:31 (日時は個人設定で未設定ならばUTC)。
【Valgrind】変更履歴

ご利用上の注意