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

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

设置选项:
Category Setting Values Description  
         

日志

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
自定义函数:
Category Function Description  
  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:\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]
Record type 1 2 3 4 5 6 7 8 9 10
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\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

注意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\test.php' =>
3 array (size=2)
4 4 => int 1
5 8 => int 1
怎么看代码追踪trace文件:
  Data format=0 format=1 Comment
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 不显示返回值
       

PHP XDEBUG的更多相关文章

  1. phpstorm 配置 xdebug调试工具

    前言   php是脚本型程序 每次出错都要手动exit断点程序不是很方便 哪里有需求哪里就有生产,Xdebug可以实现对php的断点调试.下面将我个人的安装经历分享给大家. 运行环境 windows ...

  2. xdebug断点调试原理

    通过Xdebug进行远程调试时,PHPSTORM等IDE会监听Xdebug设置的调试ip和端口(php.ini中配置) [xdebug] ; Xdebug zend_extension=php_xde ...

  3. PHP的学习--在Atom中使用XDebug(Mac)

    之前写过一篇博客<PHP的学习--在sublime中使用XDebug(Ubuntu)>,讲了在Ubuntu系统 sublime 中配置 XDebug,其实配置好之后,我也很少用,原因有两点 ...

  4. xDebug + webgrind 对 php 程序进行性能分析

    环境 macOs Sierra php 7.0.8 MAMP Pro 集成环境 背景 最近有一个需要在微信朋友圈上线的 h5,本人做了一个抽奖的接口,也没多想,直接上 php ci(CodeIgnit ...

  5. PhpStorm集成xdebug进行断点调试

    本文介绍如何使用PhpStorm集成xdebug在本地开发环境进行断点调试的技巧. 我配置的环境是:Windows10 + PhpStorm10.0.1 + PHP5.6. 1. 下载xdebug的扩 ...

  6. php调试工具——XDebug使用

    下面以windows平台和Aptana Studio为例,介绍XDdebug的使用. 1.安装XDebug 1)下载php的XDebug扩展.dll文件,官网下载地址是https://xdebug.o ...

  7. zend studio 13.5破解以及集成xdebug

    环境说明: 操作系统:Windows 7 Ultimate Edition Service Pack 1 PHP:7.0.11 TS Zend Studio:13.5.0 Xdebug:2.5.0 一 ...

  8. PhpStorm/Xdebug安装使用

    安装环境:XAMPP;phpStorm版本10; windows 7 64bit. XAMPP.phpStorm 都直接安装在了D盘根目录,9999m目录建在D:\xampp\htocts下,即目录工 ...

  9. 本地xdebug调试搭建 Laravel+homestead+phpstorm

    1.在homestead virtual box安装和配置xdebug 先在终端运行vagrant up 和 vagrant ssh,ssh远程到homestead,然后复制以下代码到一个shell文 ...

  10. PHP:Xdebug配置

    在配置Xdebug时,之前经历了无数次失败,终于配置成功! 以下是配置失败的原因: 1.下载时,选用Xdebug的版本不正确: 2.配置时,Xdebug文件名或文件的路径不正确: 在参考 http:/ ...

随机推荐

  1. JS性能消耗在哪里?

    内部原因:构造,递归,循环,拷贝,动态执行,字符串操作等   1.过度的封装(过多的创建“庞大的”对象,但是如果在允许的条件下,面向对象的封装是可以提高维护性,而且符合我们的高内聚低耦合原则): 2. ...

  2. UML时序图总结

    前言 在我的工作中,用的最多的就是时序图了.可能由于工作的原因,我也是最喜欢画时序图了,很清楚,很明了,什么时候发送什么消息,到达什么状态,一下子就展示在你的脑海里,对于消息驱动的程序来说,是再好不过 ...

  3. 变态的HelloWorld

    public static void main(String[] args) { int i, n[] = { (((1 << 1) << (1 << 1) < ...

  4. 转:ASP.NET MVC扩展之HtmlHelper辅助方法

    1.什么是HtmlHelper辅助方法?其实就是HtmlHelper类的扩展方法,如下所示: namespace System.Web.Mvc.Html { public static class F ...

  5. Selenium2学习-029-WebUI自动化实战实例-027-判断元素是否存在

    非常简单的源码,敬请各位小主参阅.若有不足之处,敬请大神指正,不胜感激! /** * Verify the element exist or not * * @author Aaron.ffp * @ ...

  6. [转]详细介绍java中的数据结构

    详细介绍java中的数据结构 本文介绍的是java中的数据结构,本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类.一起来看本文吧! 也许你已经熟练使用了java.util包里面的各 ...

  7. SVN Working Copy locked ,并且进行clean up也还是不行

    标题:working copy locked 提示:your working copy appears to be locked. run cleanup to amend the situation ...

  8. 让DIV中的内容水平和垂直居中

    让一个层水平垂直居中是一个非常常见的布局方式,但在html中水平居中使用margin:0px auto;可以实现,但垂直居中使用外边距是无法达到效果的.(页面设置height:100%;是无效的),这 ...

  9. Interview Question

    HDS(11.16.2015): How to design an non-stop website like Google or Amazon? What design patterns are y ...

  10. 蒋鑫:为什么 Git 比 SVN 好

    在版本控制系统的选型上,是选择Git还是SVN? 对于开源项目来说这不算问题.使用Git极大地提高了开发效率.扩大了开源项目的参与度. 增强了版本控制系统的安全性,选择Git早已是大势所趋. 但对于企 ...