仕事で、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
のチェックを外すとコアダンプしなくなりました。
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)