flipfrogの技術ブログ

主に技術的な記事を書きます

PHP7.2 + xdebug 3.1.5 + PHPStorm(2022.2.3) で、ステップ実行したときにSegmentation faultする件

仕事で、PHP7.2実行環境とxdebug3.1.5の組み合わせで、ブレークポイントで止まったあとにステップ実行すると、Segmentation faultする現象の対応に時間を割いてしまったのでメモ。

  • IDEは、PHPStorm(2022.2.3)です。
  • VSCodeをインストールして同じことをすると、コアダンプしないで使うことができました。
  • PHP7.4では問題なく動作するようなので、PHP7.2との組み合わせ固有の現象のようです。

対処方法は、PHPStormのPreferences... > PHP > Debug にある、Evaluation欄で Enable '__toString' object viewのチェックを外すとコアダンプしなくなりました。

PHPStormの環境設定画面のスクリーンショット

php -vを実行したときの出力は、以下の通りです。

PHP 7.2.24 (cli) (built: Oct 22 2019 08:28:36) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v3.1.5, Copyright (c) 2002-2022, by Derick Rethans
    with Zend OPcache v7.2.24, Copyright (c) 1999-2018, by Zend Technologies

php.iniのxdebugセクションの抜粋は、以下の通りです。

[xdebug]
zend_extension=/usr/lib64/php/modules/xdebug.so
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.discover_client_host = 0
xdebug.remote_handler = "dbgp"
xdebug.client_port=9003
xdebug.client_host=host.docker.internal
xdebug.idekey=phpstorm

OSは、AlmaLinux 8をDocker環境で実行しています。

# cat /etc/redhat-release 
AlmaLinux release 8.6 (Sky Tiger)

gdbを使って実行させたときのバックトレースです。

(gdb) run test.php
Starting program: /usr/bin/php test.php
warning: Error disabling address space randomization: Operation not permitted
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1".

Program received signal SIGSEGV, Segmentation fault.
0x00005583000a56dd in _zval_ptr_dtor ()
(gdb) bt
#0  0x00005583000a56dd in _zval_ptr_dtor ()
#1  0x00007f6e28dd85c0 in xdebug_dbgp_handle_eval (retval=0x7fff3966c850, 
    context=<optimized out>, args=<optimized out>)
    at /var/tmp/xdebug/src/debugger/handler_dbgp.c:1055
#2  0x00007f6e28ddcdc6 in xdebug_dbgp_parse_option (flags=0, 
    retval=<optimized out>, 
    line=0x55830245fa10 "eval -i 24 -- KHN0cmluZykoJHNtYXJ0eSk=", 
    context=0x7f6e28ffdcb8 <xdebug_globals+376>)
    at /var/tmp/xdebug/src/debugger/handler_dbgp.c:2230
#3  xdebug_dbgp_cmdloop (context=0x7f6e28ffdcb8 <xdebug_globals+376>, bail=1)
    at /var/tmp/xdebug/src/debugger/handler_dbgp.c:2340
#4  0x00007f6e28dddd99 in xdebug_dbgp_breakpoint (
    context=0x7f6e28ffdcb8 <xdebug_globals+376>, stack=<optimized out>, 
    filename=<optimized out>, lineno=23, type=<optimized out>, exception=0x0, 
    code=0x0, message=0x0, brk_info=0x558302416b60)
    at /var/tmp/xdebug/src/debugger/handler_dbgp.c:2701
#5  0x00007f6e28dd3534 in xdebug_debugger_statement_call (
    filename=0x7f6e29076030, lineno=23)
    at /var/tmp/xdebug/src/debugger/debugger.c:294
#6  0x00005583000a940a in zend_llist_apply_with_argument ()
#7  0x00005583001457dd in ZEND_EXT_STMT_SPEC_HANDLER ()
#8  0x0000558300159a50 in execute_ex ()
#9  0x00007f6e28dbe60a in xdebug_execute_ex (execute_data=0x7f6e2901c030)
--Type <RET> for more, q to quit, c to continue without paging--
   r/tmp/xdebug/src/base/base.c:779
#10 0x000055830015d776 in zend_execute ()
#11 0x00005583000b74cb in zend_execute_scripts ()
#12 0x0000558300052a40 in php_execute_script ()
#13 0x000055830015fd5c in do_cli ()
#14 0x00005582fff0d632 in main ()
(gdb)