XDebug无法单步调试及E_STRICT无效解决办法

By | 2015/10/12

有个项目的代码很杂乱,为了方便分析流程,打算启用环境的xdebug分析,于是乎就踩到了两个坑:

坑1:E_STRICT无效(PHP版本5.2.17)

习惯性的使用E_ALL ^E_STRICT此类方式进行错误类型的排除,只因^比&~少了一个字符好记,而且基本上所有教程都说这两者是等价的。但怎么设置也无效,于是乎打印出E_ALL & ~E_STRICT(6143)及E_ALL ^E_STRICT(8191)的值,发现了第一个坑。
E_STRICT是在PHP5.0的版本添加的,本身值为2048,对比种表达方式就会发现值就差在这个上面,因此在某些情况下^和&~是不同的。

PHP5.4以下版本,E_ALL是不包含E_STRICT的,因此除E_STRICT外,两种表达方式值一致.

PHP5.4及以上版本,E_ALL是包含E_STRICT的,两种表达方式值一致。

ps:30719 in PHP 5.3.x, 6143 in PHP 5.2.x, 2047 previously

坑2:XDebug无法单步调试

环境是事先配置好的,支持zendOptimizer和xdebug,一直以为很完美,为了让他俩共存确实下了不少功夫。结果今天debug的时候发现xdebug可以连接,报错会中断,但自下断点无效、单步无效。

一般来说首先考虑端口冲突,就是xdebug服务端使用的端口被占用。但我这个情况并不是完全无效,所以不是这个原因。最终在google的帮助下找出原因。

xdebug是需要使用zend扩展(zend_extension_ts)的方式来加载的,虽然extension扩展也可以成功加载,但会导致功能不完整。同时zend加载需要绝对路径,相对路径也会出现无法加载的情况。

ps:zendOptimizer和xdebug无法共存是有道理的。一个是优化(解密),一个是debug分析,本来两个事情就有冲突;再者zend_extension_ts这种方式也只能加载一个组件;本想投机制作完美环境,结果给自己埋了坑。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据