ついでに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でやるなら、あとから別途コンパイルして置けばいいだけなんだけど。。