TenForward

技術ブログ。はてなダイアリーから移転しました

php の (mbstringの) デバッグ

何度もやって,やるたびにやり方を思い出しているのでメモ.

  1. apache http server を "-g" オプション付きで make
    % CFLAGS="-g -O0" ./configure --hogehoge
  2. php も同様に make
    % CFLAGS="-g -O0" ./configure --enable-mbstring ...
  3. デバッガ起動
    # gdb /path/to/httpd
  4. ブレークポイントの設定.モジュールがロードされてないので,シンボルが見つからないので予約するか?と聞かれる."y" と答える.
    # gdb /usr/local/apache2/bin/httpd
    :(snip)
    (gdb) b OnUpdate_mbstring_internal_encoding
    Function "OnUpdate_mbstring_internal_encoding" not defined.
    Make breakpoint pending on future shared library load? (y or [n]) y

    Breakpoint 1 (OnUpdate_mbstring_internal_encoding) pending.
  5. シングルプロセスモードで起動 (-X).
    (gdb) run -X
    Starting program: /usr/local/apache2/bin/httpd -X
    [Thread debugging using libthread_db enabled]
    [New Thread 0xb7d5b6c0 (LWP 10282)]
    warning: Temporarily disabling breakpoints for unloaded shared library "/usr/local/apache2/modules/libphp5.so"
    [Switching to Thread 0xb7d5b6c0 (LWP 10282)]

    Breakpoint 1, OnUpdate_mbstring_internal_encoding (entry=0x8293ba8,
    new_value=0x81ea978 "EUC-JP", new_value_length=6, mh_arg1=0x0,
    mh_arg2=0x0, mh_arg3=0x0, stage=1)
    at /home/karma/src/php-5.2.8/ext/mbstring/mbstring.c:738

apache の main の 634 行目付近まで行けば,php 内の関数とか指定しても "not defined" と怒られないので,まずは

(gdb) b 634

とかして,ブレークした所でおもむろに "b OnUpdate_mbstring_internal_encoding" とかやってもいけると思う (ddd を使ったら手元ではペンディングとかしてくれずに定義されてないと怒られるだけなので,このようにしてる).

あとは PHP の謎のマクロ定義と格闘するだけ.(-.-)