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モジュール プログラミングガイド
posted with amazlet on 06.04.30