PHP5+Code Ignite 3.1启用Xdebug2.2.5.1触发段错误如何解决
问题描述
- 调试对象:基于PHP5、CodeIgniter 3.1开发的遗留应用
- 故障现象:启用php5-xdebug开展远程调试时,Apache进程直接触发段错误,应用无法访问;禁用Xdebug后应用可正常运行,但无法开展断点调试
- 临时排查手段:当前已暂时禁用Xdebug,通过框架自带的
log_message()方法打印日志逐段排查代码问题 - 错误日志摘录(存储路径:
/var/log/apache2/error.log):
[core:notice] [pid 17627] AH00051: child pid 17634 exit signal Segmentation fault (11), possible coredump in /tmp
排查解决步骤
按优先级从高到低依次操作,每步操作完成后重启Apache验证是否恢复:
- 校验Xdebug与PHP5的版本匹配性
PHP5环境仅支持2.5.x及以下版本的Xdebug,2.6及以上版本Xdebug仅适配PHP7+,版本错配是触发段错误的最常见原因。
执行php --ri xdebug查看当前Xdebug版本,若版本号高于2.5.5,直接卸载现有php5-xdebug包,重新安装适配当前PHP5小版本的Xdebug 2.5系列稳定版即可,不要直接使用系统软件源默认拉取的最新Xdebug包,多数旧版本系统源的php5-xdebug依赖关系存在错误。 - 收敛Xdebug配置,移除冲突参数
编辑Xdebug配置文件(默认路径/etc/php5/apache2/conf.d/20-xdebug.ini),先注释所有自定义参数,仅保留最基础的远程调试最小配置,关闭所有非必要的堆栈收集、性能分析、自动追踪功能:
重点移除zend_extension=xdebug.so xdebug.remote_enable=1 xdebug.remote_handler=dbgp xdebug.remote_host=127.0.0.1 xdebug.remote_port=9000 xdebug.remote_autostart=0xdebug.collect_params=4、xdebug.show_exception_trace=1两个参数,这两个参数在PHP5环境下会和CodeIgniter 3内置的异常捕获、错误处理逻辑产生冲突,触发访问越界导致段错误。 - 排查扩展与框架钩子冲突
若调整配置后仍触发段错误,临时禁用所有opcode缓存类扩展(包括eAccelerator、XCache、Zend Optimizer等),这类扩展会修改PHP opcode执行流程,和Xdebug的断点注入逻辑存在已知兼容问题。
同时临时注释应用中自定义的全局错误处理、异常处理注册逻辑(即通过set_error_handler()、set_exception_handler()注册的处理函数),以及CI框架配置中开启的前置/后置输出钩子,这类自定义逻辑会和Xdebug的调用栈追踪产生嵌套调用,导致栈溢出触发段错误。 - 通过coredump定位精准冲突点
若以上操作均无效,先执行ulimit -c unlimited开启核心转储,修改Apache配置中的CoreDumpDirectory为/tmp并给目录授予写入权限,复现段错误后进入/tmp目录找到生成的core文件,执行gdb /usr/sbin/apache2 [core文件名],进入gdb后输入bt full打印完整崩溃堆栈,即可定位到具体冲突的扩展或代码片段。 - 备用调试方案
若始终无法解决Xdebug兼容问题,可安装php5-xhprof扩展实现调用栈追踪,配合debug_backtrace()方法打印上下文信息,排查效率远高于纯手动打log_message()日志,且不会触发段错误。
内容的提问来源于stack exchange,提问作者brunocosta
相关产品推荐
相关产品推荐

