トップ 差分 一覧 ソース 検索 ヘルプ 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.


技術的雑談へ戻る

TrackBack

TrackBack URL for this entry:
http://www.himajin2001.com/fswiki/tb.cgi/%B5%BB%BD%D1%C5%AA%BB%A8%C3%CC%2Dphp%A1%DCxdebug%A4%C7Segmentation+fault%2811%29%A4%AC%C8%AF%C0%B8%A4%B9%A4%EB

技術的雑談へ戻る

最終更新日時:最終更新時間:2011年12月08日 05時47分27秒
トップページに戻る

please post your message
件名
お名前
コメント
URL(入力するとす ぱ むとみなします!)