失敗は成功の母。
ということにしておこう。

(ノ・・)ン。。。。。。(((●コロコロッ

開発用のサーバを構築し、
実際に開発しているとどうにも変な動きをしていた。
というのも、サイトにアクセスすると、
画面が真っ白だったりアクセスできませんメッセージが出たりする。

Apacheのプロセスが落ちたんだろうなぁ。
と漠然と思っていたのだが、
結構頻繁に起こるのさすがに調査をすることにした。


ちなみに構成は
Debian Sarge
Apache 2.0.x (debian package)
PHP 5.1.x

さて、Apacheのエラーログをみてみると、
エラーが続発していて目を丸くした。
[Sat May 13 17:44:51 2006] [notice] child pid 28627 exit signal Segmentation fault (11)
[Sat May 13 17:44:52 2006] [notice] child pid 28630 exit signal Segmentation fault (11)
[Sat May 13 17:44:55 2006] [notice] child pid 28629 exit signal Segmentation fault (11)
[Sat May 13 17:44:55 2006] [notice] child pid 28626 exit signal Segmentation fault (11)
[Sat May 13 17:44:56 2006] [notice] child pid 28632 exit signal Segmentation fault (11)
[Sat May 13 17:49:22 2006] [notice] child pid 28617 exit signal Segmentation fault (11)



(゜Д゜;) ……。。

行数でいえば、
アクセスログ並みといっておこう。




・・・とりあえずググるか。



特別有益な情報は全く得られず。
困った。
PHPのバグなのではと疑いたくなり、
ApacheのバージョンとPHPのバージョン、configureオプションを最小にしたりと、
いろいろやってみたが原因はわからず。
( ̄-  ̄ ) ウーン

ほとほと困り果てていたら、
こういったページにたどり着いた。
PHP で apache Segmentation fault
・・・あぁ、そうか。
関数とかを使ったときにSegmentation faultが出るのか!
と気づく。


となると調査の方法が少し変わる。
もう一度ググるとこういったページにたどり着く。
PHP Bugs: Generating a gdb backtrace
http://bugs.php.net/bugs-generating-backtrace.php

これで関数をバックトレースしてみよう。


まずは準備からしないとな。

gdbをインストール。
# apt-get install gdb


Apacheを止める。
# /etc/init.d/apache2 stop


PHPのconfigureオプションにdebugを追加してリコンパイル
$ ./configure --enable-debug 〜〜




ではデバッグ開始。
The GNU Project DebuggerからApacheを起動する。
# gdb httpd
(gdb) run -X


Segmantation faultの発生するプログラムをブラウザで閲覧する。

バックトレース開始
(gdb) bt




結果
#0 0x40daa477 in ?? ()
#1 0x406b88ac in ZEND_USER_OPCODE_SPEC_HANDLER (execute_data=0xbfffaf60) at zend_vm_execute.h:594
#2 0x406b7628 in execute (op_array=0x8581c1c) at zend_vm_execute.h:92
#3 0x406bb1f7 in ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER (execute_data=0xbfffc050) at zend_vm_execute.h:1971
#4 0x406b7628 in execute (op_array=0x84a7294) at zend_vm_execute.h:92
#5 0x406bb1f7 in ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER (execute_data=0xbfffc380) at zend_vm_execute.h:1971
#6 0x406b7628 in execute (op_array=0x853fb8c) at zend_vm_execute.h:92
#7 0x406bb1f7 in ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER (execute_data=0xbfffc5e0) at zend_vm_execute.h:1971
#8 0x406b7628 in execute (op_array=0x85cf684) at zend_vm_execute.h:92
#9 0x4069eff0 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /home/matsui/tmp/php-5.1.4/Zend/zend.c:1109
#10 0x40665693 in php_execute_script (primary_file=0xbfffe920) at /home/matsui/tmp/php-5.1.4/main/main.c:1732
#11 0x4070367f in php_handler (r=0x82fcd48) at /home/matsui/tmp/php-5.1.4/sapi/apache2handler/sapi_apache2.c:586
#12 0x0807aca5 in ap_run_handler (r=0x82fcd48) at config.c:157
#13 0x0807b2a0 in ap_invoke_handler (r=0x82fcd48) at config.c:371
#14 0x080bb90a in ap_process_request (r=0x82fcd48) at http_request.c:258
#15 0x080b9398 in ap_process_http_connection (c=0x82e9c50) at http_core.c:171
#16 0x08081625 in ap_run_process_connection (c=0x82e9c50) at connection.c:43
#17 0x080d692a in child_main (child_num_arg=17) at prefork.c:640
#18 0x080d6a62 in make_child (s=0x2, slot=0) at prefork.c:680
#19 0x080d768f in ap_mpm_run (_pconf=0x8112c48, plog=0x815ad68, s=0x81190f8) at prefork.c:956
#20 0x0806867b in main (argc=2, argv=0xbfffecc4) at main.c:712






(゚д゚)…
出力結果に唖然とする。
真っ先に現れた


ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER




やべ、見覚えありすぎだ。
早速その部分を修正。
もう一度閲覧してみると、
ヽ(^0^)ノ直った









その部分とは

zend_extensionを使わずにXdebugを使っていたこと


(>_<) アイタタ




結論:
ちゃんと仕様通りに使いましょう。

コメント








トラックバック
http://dozo.rgr.jp/sb.cgi/454
この記事のトラックバックURL
BlogRanking
オススメしたいグッズ
我の創りし物
カテゴリアーカイブ
banners
loglog
banners
Valid XHTML 1.1!
記事一覧
月別アーカイブ
最近のコメント
最近のトラックバック
リンク
リンク
関連用語
Powered by