Xdebug是一个开源的PHP程序调试工具,可以使用它来调试、跟踪及分析程序运行状态。当然,Xdebug需要结合PHP的编辑工具来打断点、跟踪、调试及分析,比较常用的PHP的Xdebug调试环境:Vim +Xdebug。
Xdebug是一个开源的PHP程序调试工具,可以使用它来调试、跟踪及分析程序运行状态。当然,Xdebug需要结合PHP的编辑工具来打断点、跟踪、调试及分析,比较常用的PHP的Xdebug调试环境:Vim +Xdebug。
· 安装配置
· 调试环境
· 跟踪分析
· 注意事项
· 遇到问题
一、安装配置
1、安装
Xdebug的安装是作为PHP的拓展而存在的,所以可参考PHP拓展文章:
http://blog.csdn.net/why_2012_gogo/article/details/51120645
2、配置
php.ini:
[xdebug]
;基本调试配置
xdebug.auto_trace = on
xdebug.collect_params = on
xdebug.collect_return = on
xdebug.profiler_enable = on
xdebug.profiler_output_dir =”/php/ext/xdebug_profilers”
xdebug.trace_output_dir = “/tmp/ext/xdebug_traces”
;远程调试设置
xdebug.remote_enable = on
xdebug.remote_host = localhost
xdebug.remote_port = 9010
xdebug.remote_autostart = on
zend_extension=/usr/local/lib/php/extensions/no-debug-non-zts-20131226/xdebug.so
用xdebug_debug_zval 和debug_backtrace,可以打印出引用计数
所有的php变量都放在了zval的容器中,一个zval变量容器,除了包含变量的类型和值,也包括了另外两个字段,一个是is_ref(bool),标识此变量是否属于引用集合,
(reference set)。另外的就是引用计数机制,用来优化内存试用。refcount用以标识指向这个zval变量容器的变量个数。
变量容器在”refcount“变成0时就被销毁。
[php] view plain copy
$a = “dog”;
$c = $b = $a;
xdebug_debug_zval( ‘a’ );
unset( $b, $c );
xdebug_debug_zval( ‘a’ );
[php] view plain copy
结果:
a: (refcount=2, is_ref=1)=’dog’
a: (refcount=1, is_ref=0)=’dog’
但是如果是数组或者对象
[php] view plain copy
$a=array(‘a’=>’avalue’,’b’=>’bvalue’);
xdebug_debug_zval('a');
结果:
a: (refcount=1, is_ref=0)=array (‘a’ => (refcount=1, is_ref=0)=’avalue’, ‘b’ => (refcount=1, is_ref=0)=’bvalue’)
[Finished in 0.2s]
所以它们的成员或属性存在自己的符号表中,所以上面一共有三个zval变量容器。a (array),a,b
当有变量引用时,用xdebug_debug_zval的到的结果为:is_ref=1;refcount=变量被引用的数量(算上变量本身)
当变量没有发生引用时,用xdebug_debug_zval的到的结果为:is_ref=0;refcount=变量被复制的数量(算上变量本身)
当有变量引用时,用debug_zval_dump的到的结果为:refcount=1(始终=1)
当变量没有发生引用时,用debug_zval_dump的到的结果为:refcount=变量被复制的数量(算上变量本身)+1