私は最近Apacheモジュールを書いています。メモリプールパラダイムを使用することは興味深いことですが、私は明らかに正しいことをしていません。セグメンテーション違反が発生しましたが、見つからないようです。私の現在のデバッグサイクルには、ap_rprintfsと、Apacheを再構築して再ロードするmakeスクリプトが含まれます。
このタイプの環境で作業するために利用できるツールの種類は何ですか?
私は最近Apacheモジュールを書いています。メモリプールパラダイムを使用することは興味深いことですが、私は明らかに正しいことをしていません。セグメンテーション違反が発生しましたが、見つからないようです。私の現在のデバッグサイクルには、ap_rprintfsと、Apacheを再構築して再ロードするmakeスクリプトが含まれます。
このタイプの環境で作業するために利用できるツールの種類は何ですか?
GNU Debugger(gdb)を使用する必要があります。コマンドを介して、 gdb内gdb bin/httpd
よりもApacheを起動します。r -X
segfaultが発生すると、コマンドで発生した場所を確認できますbt
。
ddd (gdb フロントエンド) を使用して mod_deflate Apache モジュールをデバッグした私自身の経験をここに記録しました。その投稿の内容は以下のとおりです。
このガイドでは、Apache 2.2.16 モジュールをデバッグするために必要な手順について説明します。この例でデバッグされているモジュールは、deflate モジュール (mod_deflate.c) と、データの圧縮に使用される zlib ライブラリです。この例では、zlib ライブラリと deflate モジュールの両方に、ステップ実行するカスタム コードが含まれています。
$ EXTRA_CFLAGS="-g" ./configure --prefix=/ap --with-included-apr --enable-mods-shared=all
$メイク
$ make install
注: EXTRA_CFLAGS="-g" は、コンパイラにデバッグ シンボルを含めるように指示します。--prefix=/ap インストールを /ap に配置します。--with-included-apr は、APR および APR-util コードとのバージョンまたはコンパイル オプションの不一致の可能性を取り除きます (必要ではないかもしれませんが、害はありません)。--enable-mods-shared=all を使用すると、モジュールを変更してから再ロードできます。このオプションを使用しない場合、モジュール コードはメインの Apache バイナリにコンパイルされます。
LoadModule deflate_module modules/mod_deflate.so (または類似のもの) という行が存在することを確認してください。行 AddOutputFilterByType DEFLATE text/html text/plain text/xml (または類似のもの) を追加します。
$ CFLAGS="-g" ./configure --prefix=bin
コードが最適化されないように、Makefile で -03 オプションを削除します。
$ テストを行う
$ make install
注: デフォルトでは、zlib は静的ライブラリを構築します。EXTRA_CFLAGS=-g は、コンパイラにデバッグ シンボルを含めるように指示します。--prefix=/ap インストールをビンに配置します。
$ /ap/bin/apxs -I/mydir/zlib/bin/include/ -L/mydir/zlib/bin/lib/ -c mod_deflate.c -lahaz -g
$ cp .libs/mod_deflate.so
$ /ap/modules/mod_deflate.so
$ /ap/bin/apachectl -k ストップ
$ /ap/bin/apachectl -k 開始
注: -g は、コンパイラにデバッグ シンボルを含めるように指示します。
$ ddd /ap/bin/httpd
(gdb) r -X
ctrl-c で gdb プロンプトに戻ります
File->Open Source で mod_deflate.c または aha363_zlib.c を選択
ブレークポイントを視覚的に設定するか、gdb コマンド (つまり (gdb) b aha363_zlib.c ) を介して設定します。
注: From The Apache Modules Book – Application Development with Apache pg 328 「.. -X オプションを使用して、Apache が自身を切り離し、子をフォークし、デーモン モードに入るのを防ぎます... [Apache] は着信接続の待機中にブロックされます。すべてのモジュールがロードされ、構成がアクティブになります。そこに置いておくと、Webサーバーは基本的に稼働しており、着信要求を処理します. Ctrl-c で中断してデバッガーに戻ることができます。」</p>
これで、Apache モジュール コードをデバッグする準備が整います。