• XDebug 教程


    安装说明:

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

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

    设置选项:
    CategorySettingValuesDescription 
             

    日志

    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
    自定义函数:
    CategoryFunctionDescription 
      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文件:

    复制代码
     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:wwwmyweballappstorage hird_partyossdemo est.php 0 0
    5 2 1 0 0.092995 419608 var_dump 0 D:wwwmyweballappstorage hird_partyossdemo est.php 20 1 ''
    6 2 1 1 0.093988 419608
    7 2 2 0 0.095729 419640 var_dump 0 D:wwwmyweballappstorage hird_partyossdemo est.php 21 1 TRUE
    8 2 2 1 0.096164 419640
    9 2 3 0 0.097045 419688 xdebug_get_declared_vars 0 D:wwwmyweballappstorage hird_partyossdemo est.php 26 0
    10 2 3 1 0.098388 422488
    11 2 4 0 0.098681 422520 var_dump 0 D:wwwmyweballappstorage hird_partyossdemo est.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:wwwmyweballappstorage hird_partyossdemo est.php 28 1 NULL
    14 2 5 1 0.101366 419720
    15 2 6 0 0.101759 419720 var_dump 0 D:wwwmyweballappstorage hird_partyossdemo est.php 28 1 0
    16 2 6 1 0.102262 419720
    17 2 7 0 0.102443 419888 var_dump 0 D:wwwmyweballappstorage hird_partyossdemo est.php 29 1 array (0 => 9)
    18 2 7 1 0.102703 419888
    19 2 8 0 0.102855 419760 var_dump 0 D:wwwmyweballappstorage hird_partyossdemo est.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:wwwmyweballappstorage hird_partyossdemo est.php 31 0
    22 0.103393 419808
    23 TRACE END [2012-03-24 10:24:21]
    复制代码
    Record type12345678910
    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.show_local_vars=0:

    [4]:

    复制代码
     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 ?>
    复制代码
    复制代码
     1 array (size=1)
    2 'D:www est.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
    复制代码

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

    复制代码
     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 ?>
    复制代码
    1 array (size=1)
    2 'D:www est.php' =>
    3 array (size=2)
    4 4 => int 1
    5 8 => int 1
    怎么看代码追踪trace文件:
     Dataformat=0format=1Comment
    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]
    ; 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的扩展,路径需根据自己的环境修改。 
    第二行是开启远程调试; 
    第三行是配置进行调试的主机地址; 
    第四行是配置进行调试的主机上面会监听的端口; 
    配置PhpStorm中的php解释器

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

    配置PHP的Debug

    以上截图是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

      

      后:

      并在当前调试的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 firefox插件则可以看到请求时会带一个cookie:

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

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

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

    如果我们想要终止远程调试,客户端同样会在当前调试的URL后面加上XDEBUG_SESSION_STOPXDEBUG_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中的该参数时,则会终止掉与指定客户端的连接与会话。

     

  • 相关阅读:
    unity调用Android功能
    OnLevelWasLoaded 在脚本中执行顺序
    使用Sublime编写Shader
    将当前UI配置写入文件,并且恢复
    AssetBundle 点滴
    NGUI3.7的自适应问题
    Unity3D 消息框架设计
    Unity3D 任务系统设计
    Unreal 4
    基于DBLP的作者协作关系的挖掘
  • 原文地址:https://www.cnblogs.com/grimm/p/6589268.html
Copyright © 2020-2023  润新知