トップ 一覧 検索 ヘルプ RSS ログイン

技術的雑談-php+xdebugでSegmentation fault(11)が発生するの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!技術的雑談-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 <php_load_function_extension_cb>,
	    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}}

[[技術的雑談]]へ戻る