安装说明:


PHP调试时,不得不提XDEBUG这个调试利器。学习PHP以来,几乎所有的问题我都利用它来解决。

首先关于如何安装,不在赘述,请自行google之。(需要特别注意的是:PHP5.2 和5.3 ,关于加载xdebug.dll的差别;也可以在​​这里查看细节​​​,官网也有​​说明​​)


设置选项:









日志



xdebug.trace_output_dir



日志追踪输出目录


xdebug.trace_output_name


日志文件名,xdebug提供了一系列的标识符,生成相应格式的文件名,具体请参考官网


xdebug.trace_options


记录添加到文件中方式:1 = 追加(如果存在该文件). 0 (default) = 覆盖(如果存在该文件)







显示数据

​xdebug.collect_params​


非零值 = 控制function的参数显示选项



​xdebug.collect_return​


1 = 显示function返回值. Default 0 不显示


xdebug.collect_vars


1 = 显示当前作用域使用了哪些变量,显示变量名,该选项不会记录变量的值,如果需要,使用xdebug.collect_params


​xdebug.collect_assignments​


1 = 添加一行显示变量赋值(若为1,形如$a = 1;这类Assignment Expression会在trace文件里显示)





格式

​xdebug.trace_format​




  • 0 = 人可读. 从左至右每列分别表示:时间点, 内存, 内存差 (需要设置xdebug.show_mem_delta=1), 等级, 函数名,函数参数 (需要设置,xdebug.collect_params=1,只要是非零), 当前代码行所在文件名 , 行号.
  • 1 = 机器可读[1]. 需要借助第三方app,例如:​​xdebug trace file parser​​ 或者 ​​xdebug trace viewer​
  • 2 = html格式 即table,用browser打开,显示table


​xdebug.show_mem_delta​


1 = 显示每次函数调用内存消耗(内存差)







行为 

​xdebug.auto_trace​


1 = 打开自动追踪. (追踪方式有2种,一种是自动追踪,所有php脚本运行时,都会产生trace文件;另一种是触发方式追踪,如下)


xdebug.trace_enable_trigger[2]



1 = 使用 XDEBUG_TRACE GET/POST 触发追踪, 或者通过设置cookie XDEBUG_TRACE. 为了避免每次请求时,都会生成相应trace追踪文件,你需要把auto_trace设置为0

注:该特性只在2.2+版本才能设置

 ​​[xdebug-general] Re: Is trace_enable_trigger defunct?​​ 






​这里查看具体显示区别​

限制

xdebug.var_display_max_depth


数组和对象元素显示深度:主要用在数组嵌套,对象属性嵌套时,显示几级的元素内容. Default 3.

xdebug.var_display_max_data


变量值为字符串时显示多长. Default 512.

xdebug.var_display_max_children


数组和对象元素显示的个数. Default 128

自定义函数:



void xdebug_enable()

手动打开,相当于xdebug.default_enable=on







void var_dump()

覆写php提供的var_dump,出错时,显示函数堆栈信息,(前提:php.ini里html_errors为1),使用xdebug.overload_var_dump 设置是否覆写







void xdebug_start_trace( 

string trace_file_path 

[, integer options] )

手动控制需要追踪的代码段

trace_file_path :文件路径(相对或绝对,若为空).如果为空,或者不传参, 使用xdebug.trace_output_dir设置的目录

options :


  • XDEBUG_TRACE_APPEND: 1 = 追加文件内容末尾, 0 = 覆写该文件
  • XDEBUG_TRACE_COMPUTERIZED:

    • 2 =同 xdebug.trace_format=1 .


  • XDEBUG_TRACE_HTML: 4 = 输出HTML表格,浏览器打开为一table








void xdebug_stop_trace()

停止追踪,代码追踪在该行停止







string xdebug_get_tracefile_name()

获得输出文件名,与 xdebug.auto_trace配合使用.







void xdebug_var_dump([mixed var[,...]])

 输出变量详细信息,相当于php里的var_dump,具体显示请看​​这里​







​xdebug.show_local_vars​

 默认为0,不显示;非零时,在php执行出错时,显示出错代码所在作用域所有本地变量(注:这会产生大量信息,因此默认是closed),具体显示差别如下图[3]







array xdebug_get_declared_vars()

显示当前作用域中已声明的变量







array xdebug_get_code_coverage()

显示某一段代码内,代码执行到哪些行[4]






注:列举一部分函数,其它请参考​​官网​


[1]:

针对xdebug.trace_format=1,每列所代表含义:

附上具体生成trace文件:

XDebug 教程_php

1 Version: 2.2.0rc1
2 File format: 2
3 TRACE START [2012-03-24 10:24:20]
4 1    0    0    0.089847    419576    {main}    1        D:\www\myweb\all\app\storage\third_party\oss\demo\test.php    0    0
5 2    1    0    0.092995    419608    var_dump    0        D:\www\myweb\all\app\storage\third_party\oss\demo\test.php    20    1    ''
6 2    1    1    0.093988    419608
7 2    2    0    0.095729    419640    var_dump    0        D:\www\myweb\all\app\storage\third_party\oss\demo\test.php    21    1    TRUE
8 2    2    1    0.096164    419640
9 2    3    0    0.097045    419688    xdebug_get_declared_vars    0        D:\www\myweb\all\app\storage\third_party\oss\demo\test.php    26    0
10 2    3    1    0.098388    422488
11 2    4    0    0.098681    422520    var_dump    0        D:\www\myweb\all\app\storage\third_party\oss\demo\test.php    26    1    array (0 => 't1', 1 => 'items', 2 => 'a', 3 => 'arr', 4 => 'last_item', 5 => 'nn', 6 => 'current_item', 7 => 'ccccccccb', 8 => 'b', 9 => 'i', 10 => 'result', 11 => 'k', 12 => 'value', 13 => 'config', 14 => 'row', 15 => 't', 16 => 'key', 17 => 'v', 18 => 'input', 19 => 'fields', 20 => 'ar', 21 => 's', 22 => 'mysqli', 23 => 'tag', 24 => 'dir', 25 => 'configs', 26 => 'type')
12 2    4    1    0.100691    422520
13 2    5    0    0.101007    419720    intval    0        D:\www\myweb\all\app\storage\third_party\oss\demo\test.php    28    1    NULL
14 2    5    1    0.101366    419720
15 2    6    0    0.101759    419720    var_dump    0        D:\www\myweb\all\app\storage\third_party\oss\demo\test.php    28    1    0
16 2    6    1    0.102262    419720
17 2    7    0    0.102443    419888    var_dump    0        D:\www\myweb\all\app\storage\third_party\oss\demo\test.php    29    1    array (0 => 9)
18 2    7    1    0.102703    419888
19 2    8    0    0.102855    419760    var_dump    0        D:\www\myweb\all\app\storage\third_party\oss\demo\test.php    30    1    'D:\\www\\CodeIgniter\\index.php'
20 2    8    1    0.103096    419760
21 2    9    0    0.103229    419688    xdebug_stop_trace    0        D:\www\myweb\all\app\storage\third_party\oss\demo\test.php    31    0
22             0.103393    419808
23 TRACE END   [2012-03-24 10:24:21]

XDebug 教程_php


Entry入口

level


函数编号



总是'0'


时间点

内存消耗

函数名

自定义 (1) or php内置函数 (0)

include/require的文件名

文件名

执行行号

Exit出口

level

函数编号

总是'1'

时间点

内存消耗

[2]:

如果你使用触发方式启用代码追踪:(xdebug.auto_trace = 0;xdebug.trace_enable_trigger = 1)

那么,你可以在URL里添加XDEBUG_TRACE,例如:localhost/test.php?XDEBUG_TRACE,或者localhost//test.php?XDEBUG_TRACE=1(任意值)。

是不是觉得很麻烦,那么装个插件,让它来帮你。​​Chrome XDEBUG Helper​​,使用它,你可以切换3种状态,disabled ,debugging enabled,profiling enabled(下篇详细介绍),然后切换到debugging enabled。运行该脚本,(去掉URL里的?XDEBUG_TRACE),就可以代码跟踪了。

不过,我发现好像这个状态不管用,启用该状态,也不会自动跟踪代码生成trace文件。

再次提醒:该特性只在xdebug2.2版本才实现了。

使用xdebug_start_trace()和xdebug_stop_trace()可以手动追踪你的代码执行情况。


1 xdebug_start_trace();
2 //your code required to trace
3 xdebug_stop_trace();



[3]:

xdebug.show_local_vars=1:

XDebug 教程_远程调试_03

xdebug.show_local_vars=0:

XDebug 教程_文件名_04

[4]:

XDebug 教程_php

1 <?php
2  xdebug_start_code_coverage();
3
4     function a($a) {
5         echo $a * 2.5;
6     }
7
8     function b($count) {
9         for ($i = 0; $i < $count; $i++) {
10             a($i + 0.17);
11         }
12     }
13
14     b(6);
15     b(10);
16
17 var_dump(xdebug_get_code_coverage());
18 ?>

XDebug 教程_phpXDebug 教程_php

1 array (size=1)
2   'D:\www\test.php' =>
3     array (size=11)
4       4 => int 1
5       5 => int 1
6       6 => int 1
7       8 => int 1
8       9 => int 1
9       10 => int 1
10       11 => int 1
11       12 => int 1
12       14 => int 1
13       15 => int 1
14       17 => int 1

XDebug 教程_php

注意var_dump(xdebug_get_code_coverage());所在位置区别。

XDebug 教程_php

1 <?php
2  xdebug_start_code_coverage();
3
4     function a($a) {
5         echo $a * 2.5;
6     }
7
8  var_dump(xdebug_get_code_coverage());
9
10     function b($count) {
11         for ($i = 0; $i < $count; $i++) {
12             a($i + 0.17);
13         }
14     }
15
16     b(6);
17     b(10);
18 ?>

XDebug 教程_php

1 array (size=1)
2   'D:\www\test.php' =>
3     array (size=2)
4       4 => int 1
5       8 => int 1



怎么看代码追踪trace文件:



Call              





Call level

Indent level

Col 1


Call number

不显示

Col 2


Call vs return

-

Col 3

Call =0, Return = 1

Delta time

Col 1

Col 4


Memory

Col 2

Col 5


Delta memory

Col 3

-


"->"

Col 4

-

直接调用call

Statement

Col 5 (incl spaces)

-

按PHP语义格式化函数语句

Function name

-

Col 6

函数名

Builtin vs User func

(Not avail)

Col 7

0 = 内置函数; 1 = 自定义函数

Source file path:line

Col 6

-


Source file path


Col 8


Line num


Col 9


List of args

(included in Statement)

Col 10...n

例如:


  • var = value
  • array(index => value...)
  • just value (builtin funcs)


 





Return         





Call level

Indent level

Col 1


Call number

(not explicit)

Col 2


Call vs return

-

Col 3

Call =0, Return = 1

Delta time

-

Col 4


Memory

-

Col 5


Delta memory

-

-


">=>"

Col 1

-

返回值

Return value

Col 2

(Not avail)

format =1 不显示返回值






断点调试

通过Xdebug进行断点调试调试时,PHPSTORM等IDE会监听Xdebug设置的调试ip和端口(php.ini中配置)

XDebug 教程_php

[xdebug] ; Xdebug zend_extension=php_xdebug.dll xdebug.remote_enable = On xdebug.remote_host = 127.0.0.1 xdebug.remote_port = 9000 xdebug.idekey="PHPSTORM"

XDebug 教程_php

第一行是加载xdebug的扩展,路径需根据自己的环境修改。 

第二行是开启远程调试; 

第三行是配置进行调试的主机地址; 

第四行是配置进行调试的主机上面会监听的端口; 

配置PhpStorm中的php解释器

依次点击菜单File-Settings,打开如下菜单:

XDebug 教程_ide_13

XDebug 教程_远程调试_14

配置PHP的Debug

XDebug 教程_远程调试_15

以上截图是PhpStorm的默认值,红框部分的Debug port应该与php.ini中的xdebug.remote_port保持一致。所以只有在php.ini中xdebug.remote_port不是9000的时候,才需要去这个地方设置。

至此,PhpStorm应用xdebug的调试环境就已经配置好了。

根据remote_host跟remote_port,xdebug就知道该把调试连接发送到哪里。

下面这张截图是phpstorm开启listening for php debug connections

XDebug 教程_文件名_16

后:

XDebug 教程_客户端_17

并在当前调试的URL后面加上了​​XDEBUG_SESSION_START​​的请求参数,参数值为IDE标识,这个标识相当于用户名,用以区别不同的IDE(chrome或者firefox中的xdebug扩展(firefox中我用的是The easiest Xdebug) 是通过设置cookie的方式),然后向PHP服务器发送请求,例如:http://www.example.com?XDEBUG_SESSION_START=ECLIPSE_DBGP&KEY=13986635740313。

访问后就会进入断点:

XDebug 教程_远程调试_18


而通过xdebug firefox插件则可以看到请求时会带一个cookie:

XDebug 教程_文件名_19

[默认配置下,Xdebug只能为一个客户端提供远程调试服务,如果想要为多个客户端提供远程调试服务,则需要设置​​xdebug.remote_connect_back = 1​​。]

当客户端和Xdebug建立DBGP(phpstorm中配置debug时需要在file->settings->Languages & Frameworks->PHP->Debug->DBGp Proxy

XDebug 教程_远程调试_20

连接后,客户端就可以为我们提供远程调试服务了,远程调试会话开启流程如下图所示:

XDebug 教程_ide_21

如果我们想要终止远程调试,客户端同样会在当前调试的URL后面加上​​XDEBUG_SESSION_STOP​​​或​​XDEBUG_SESSION_STOP_NO_EXEC​​(XDEBUG_SESSION_STOP_NO_EXEC表示脚本尚未执行)参数,然后向PHP服务器发送请求,链接例如:

http://localhost/index.php?XDEBUG_SESSION_STOP_NO_EXEC=ECLIPSE_DBGP&KEY=13986635740313

Xdebug模块检测到URL中的该参数时,则会终止掉与指定客户端的连接与会话。




学习时的痛苦是暂时的 未学到的痛苦是终生的