ValgrindでApacheモジュールのメモリバグを見つけよう

mod_uploaderの作者さんがまとめている開発Tips(http://acapulco.dyndns.org/mod_uploader/module_dev.htm)にあったデバッグ方法を試してみました。

Valgrind

http://valgrind.org/
Valgrindはメモリ周りのバグや、スレッド系のバグを自動的に検出してくれるツールです。
インストールは

./configure
make
make install

で完了です。
a.out(-gオプションでコンパイルしてください)のメモリ周りのチェックを行う場合は

 valgrind --leak-check=yes a.out

とやると、こんな結果が出力されてメモリリークしている場所がずばり表示されます。

  ==19182== 40 bytes in 1 blocks are definitely lost in loss record 1 of 1
  ==19182==    at 0x1B8FF5CD: malloc (vg_replace_malloc.c:130)
  ==19182==    by 0x8048385: f (a.c:5)
  ==19182==    by 0x80483AB: main (a.c:11)

デバッグ用のApacheのビルド

モジュール開発時に使用するApacheを /usr/local/httpdにインストールします。

export CPPFLAGS=-DAPR_POOL_DEBUG
./configure --prefix=/usr/local/httpd --enable-deflat --enable-rewrite --enable-proxy --enable-ssl --with-mpm=prefork
make
make install

APR_POOL_DEBUGとすると、apr_pool系のデバッグが有効になるらしいです。

ApacheモジュールをValgrindでチェック

Apacheモジュールを -g でビルドしておき、以下のように起動すると

sudo valgrind -v --leak-check=yes --show-reachable=yes --error-limit=no --tool=memcheck /usr/local/httpd/bin/httpd -X -f /usr/local/httpd/conf/httpd.conf 2>&1 | tee valgrind.log

結果は、こんな感じ

==10258== Invalid read of size 1
==10258==    at 0x48C508F: apr_pstrdup (apr_strings.c:77)
    ・
    ・
    ・

というわけで、バグが見つかりました。・゚・(ノД`)・゚・。

とても便利なのでぜひ試してみましょう。

Apacheモジュール プログラミングガイド
小山 浩之
技術評論社 (2003/08/01)
売り上げランキング: 29,568

GDBハンドブック
GDBハンドブック
posted with amazlet on 06.04.30
アーノルド ロビンス Arnold Robbins 千住 治郎
オライリージャパン (2005/09)
売り上げランキング: 28,991