!!!技術的雑談-php+xdebugでSegmentation fault(11)が発生する !!環境 *CentOS5.3 x86_64 *php 5.2.11 *xdebug 2.0.5 !!現象 *phpにxdebugをextensionで追加した時にSegmentation faultが発生する **Apache httpdと組み合わせている時にはerror_logに「[notice] child pid nnnn exit signal Segmentation fault (11)」のメッセージが出る。 ***httpdの起動自体に問題はない。 ***場合によるとxdebugの機能を使わないphpのページなどは正常に動く。 **コマンドラインから同じphp.iniを使用するphpコマンド(例えばphp -i)を実行した時に「セグメンテーションフォルトが発生しました」と出る。 !!原因 *php.iniのxdebug.soのパス指定に問題がある場合にSegmentation faultが発生する。 !!対処 php.ini内の「extension=XXXXXX.so」でphpの拡張モジュールの読み込み指定を行うが、その際のXXXXX.soを探す位置は「extension_dir=」が元になる。 xdebugの本家HPでは、「extensionに書くxdebug.soのパスは絶対パス」と書いてあるが、実際には「extension_dir」からの相対パスとして扱われる。 なので、 extension_dir = "/usr/lib/php/extensions" と書いてある場合に、「pear install xdebug」によってインストールされるxdebug.so「/usr/lib/php/extensions/debug-zts-20060613/xdebug.so」を指定する場合、 extension=/usr/lib/php/extensions/debug-zts-20060613/xdebug.so と記述すると、xdebug.soが読み込めない。 (内部的に「/usr/lib/php/extensions//usr/lib/php/extensions/debug-zts-20060613/xdebug.so」を探しに行ってる。) よって、 extension=debug-zts-20060613/xdebug.so と書くか、もしくは/usr/lib/php/extensions/debug-zts-20060613/内のxdebug.soを/usr/lib/php/extensionsにコピーした上で extension=xdebug.so とするのが正しいと思われる。 また、他のphpのバージョンで再現するかは不明だが、extensionで指定された.soが見つからなかった時のphpのエラー処理がおかしいらしく、本来出力されるはずの「PHP Warning: PHP Startup: Unable to load dynamic library './debug-zts-20060613/xdebug.so' - ./debug-zts-20060613/xdebug.so: cannot open shared object file : No such file or directory in Unknown on lin"...」というメッセージが出力されず、/usr/local/src/php-5.2.11/ext/date/php_date.c:590で落ちている。 おそらくこれはphpの初期化の段階でログファイルのopenの前にエラーログを出力しようとしているか、その行の処理「if (DATEG(timezone) && (strlen(DATEG(timezone)) > 0)) {」のどれかの変数の値が未確保の為に発生しているものと思われる。 とりあえず、phpでSegmentation faultが発生した場合でかつextensionを使っている場合は「extension_dir」と「extension」に記載されているパスを確認してみると良いと思われる。 ちなみに、問題が発生した箇所のBackTraceは以下の通り。 Program received signal SIGSEGV, Segmentation fault. 0x00000000004979da in guess_timezone (tzdb=0xf61d20, tsrm_ls=0x1ee97500) at /usr/local/src/php-5.2.11/ext/date/php_date.c:590 590 if (DATEG(timezone) && (strlen(DATEG(timezone)) > 0)) { (gdb) bt #0 0x00000000004979da in guess_timezone (tzdb=0xf61d20, tsrm_ls=0x1ee97500) at /usr/local/src/php-5.2.11/ext/date/php_date.c:590 #1 0x0000000000497cf3 in get_timezone_info (tsrm_ls=0x1ee97500) at /usr/local/src/php-5.2.11/ext/date/php_date.c:675 #2 0x00000000004998a1 in php_format_date (format=0xbc8c5f "d-M-Y H:i:s", format_len=11, ts=1276220841, localtime=1, tsrm_ls=0x1ee97500) at /usr/local/src/php-5.2.11/ext/date/php_date.c:925 #3 0x00000000007e2898 in php_log_err ( log_message=0x2b294f8eca38 "PHP Warning: PHP Startup: Unable to load dynamic library './debug-zts-20060613/xdebug.so' - ./debug-zts-20060613/xdebug.so: cannot open shared object file: No such file or directory in Unknown on lin"..., tsrm_ls=0x1ee97500) at /usr/local/src/php-5.2.11/main/main.c:507 #4 0x00000000007e42ec in php_error_cb (type=32, error_filename=0xbe5a8b "Unknown", error_lineno=0, format=0xbc8cf9 "%s", args=0x7fff5bbf4b60) at /usr/local/src/php-5.2.11/main/main.c:905 #5 0x000000000086220d in zend_error (type=32, format=0xbc8cf9 "%s") at /usr/local/src/php-5.2.11/Zend/zend.c:967 #6 0x00000000007e3631 in php_verror (docref=0x0, params=0xbc8759 "", type=32, format=0xbb7db0 "Unable to load dynamic library '%s' - %s", args=0x7fff5bbf4dd0, tsrm_ls=0x1ee97500) at /usr/local/src/php-5.2.11/main/main.c:722 #7 0x00000000007e375f in php_error_docref0 (docref=0x0, tsrm_ls=0x1ee97500, type=32, format=0xbb7db0 "Unable to load dynamic library '%s' - %s") at /usr/local/src/php-5.2.11/main/main.c:734 #8 0x0000000000737c37 in php_dl (file=0x1eea9020, type=1, return_value=0x7fff5bbf4f80, start_now=0, tsrm_ls=0x1ee97500) at /usr/local/src/php-5.2.11/ext/standard/dl.c:152 #9 0x00000000007f0ccc in php_load_function_extension_cb (arg=0x1eea9020, tsrm_ls=0x1ee97500) at /usr/local/src/php-5.2.11/main/php_ini.c:236 #10 0x0000000000854439 in zend_llist_apply (l=0xffa978, func=0x7f0c96 , tsrm_ls=0x1ee97500) at /usr/local/src/php-5.2.11/Zend/zend_llist.c:193 #11 0x00000000007f1ca8 in php_ini_register_extensions (tsrm_ls=0x1ee97500) at /usr/local/src/php-5.2.11/main/php_ini.c:617 #12 0x00000000007e7c05 in php_module_startup (sf=0xfbd120, additional_modules=0x0, num_additional_modules=0) at /usr/local/src/php-5.2.11/main/main.c:1839 #13 0x00000000008fd2b7 in php_cli_startup (sapi_module=0xfbd120) at /usr/local/src/php-5.2.11/sapi/cli/php_cli.c:386 #14 0x00000000008fe085 in main (argc=2, argv=0x7fff5bbf5588) at /usr/local/src/php-5.2.11/sapi/cli/php_cli.c:745 これは、phpとxdebugをCPPFLAGに-gをつけてコンパイルしないと表示させる事ができない…。メンドイ。 !!履歴 2010/6/11 -- 初版 [[技術的雑談]]へ戻る !!突っ込み ::Re: - Alexandra (2012年06月06日 08時46分15秒) I can't hear anything over the sound of how awesome this artcile is. {{comment multi|w}} [[技術的雑談]]へ戻る {{trackback}} [[技術的雑談]]へ戻る