ついでにapache2もdebugしてみる
とりあえず、VMWare上のubuntu7.10で httpd-2.0.55をdebugコンパイルして、debugしてみた。 やり方は、かなり簡単。 1. まずApacheをインストール DEBUG情報を付けないと駄目なので、 環境変数のCFLAGSをセットして、configureを実行するのがポイント。 場合に応じて、CPPFLAGSもセット。 $ cd ~/oss_src/httpd-2.0.55 $ CFLAGS=-g ./configure --enable-so --enable-mods-shared=all $ make 2>&1 | tee make.log $ sudo make install makeのログを見ると gcc のコンパイルオプションに -gがあるのを確認できるはず。 2. gdbで起動してみる $ cd /usr/local/apache2/bin $ sudo gdb -tui ./httpd --tuiで上にソースを表示させておくとやりやすいかも。 いちいちlistコマンド入れるのもなんだから。 3. gdbでbreakpoint張って、動かす (gdb) break ap_read_request Breakpoint 1 at 0x80823eb: file protocol.c, line 830. (gdb) run -X -f /usr/local/apache2/conf/httpd.conf Starting program: /usr/local/apache2/bin/httpd -X -f /usr/local/apache2/conf/htt pd.conf [Thread debugging using libthread_db enabled] [New Thread -1211274560 (LWP 11035)] 動いたみたいなんで、ブラウザーからアクセスしてみる。 4. ブラウザーからアクセスしてみる ブラウザーからページにアクセスしてみると動いてるみたい。 [Switching to Thread -1211274560 (LWP 11035)] Breakpoint 1, ap_read_request (conn=0x816e028) at protocol.c:830 (gdb) bt #0 ap_read_request (conn=0x816e028) at protocol.c:830 #1 0x080657fa in ap_process_http_connection (c=0x816e028) at http_core.c:244 #2 0x0807cda7 in ap_run_process_connection (c=0x816e028) at connection.c:43 #3 0x0807d1e4 in ap_process_connection (c=0x816e028, csd=0x816df50) at connection.c:176 #4 0x0806e346 in child_main (child_num_arg=0) at prefork.c:610 #5 0x0806e428 in make_child (s=0x80b3e88, slot=0) at prefork.c:650 #6 0x0806e573 in startup_children (number_to_start=5) at prefork.c:722 #7 0x0806e9d9 in ap_mpm_run (_pconf=0x80b20a8, plog=0x80de158, s=0x80b3e88) at prefork.c:941 #8 0x08076c7a in main (argc=4, argv=0xbf998064) at main.c:618 (gdb) continue Continuing. あとは好きなところにbreakpointはって中身を追っていけばいいかも。 処理の詳細は、APRがかなりかかわってるので、そこの仕様とか理解していかないといけないことと マクロと関数ポインタ周りを押さえないと駄目かも? と見ていて思ったり。 ちなみに2.2.6で同じオプションでやると、mod_deflateがzlibに依存するので、 エラーになるんで、 $ sudo apt-get install zlib1g-dev 先に入れておいておくと吉。 soでやるなら、あとから別途コンパイルして置けばいいだけなんだけど。。