1、介绍与安装

Xdebug是一个PHP扩展,安装配置好后,可以自动记录运行了哪些函数,用了多少毫秒,从哪个文件运行到哪个文件等等

它记下来的调试信息很详细,对一些复杂程序跟踪调试有很大的辅助效果,能明显快速地定位问题,缩短调试时间

官方网站:http://xdebug.org/

官方文档:http://xdebug.org/docs/all_settings


先确认一下你有没有安装Xdebug

执行phpinfo();如果没有图中这一块内容就是没有安装Xdebug了

安装方法

并不是随便下载扩展文件安装就可以的,它针对不同版本的PHP有不同的扩展文件提供给你下载

下面教你通过官方的分析结果来引导你安装

  1. 先进入官方网站,然后点击上面横向导航中的download

  2. 进入下载页面后,虽然页面下面有很多版本的下载,如果你不熟悉的话我不建议你下载,没准安装是不能用的,按我接下来说的去安装一般都能妥妥地使用起来

    点击custom installation instructions链接进入自定义安装引导页面

  3. 进入自定义安装引导后是下面这样的:

    分析需要一段时间,我最短等过几秒的,最长等过60秒左右,有时候也看网络情况吧,毕竟是提交到国外网站,分析完成后会自动显示分析结果,如下图:

    另外如果在linux系统环境下执行phpinfo也可以这样的,只是安装流程会比较多,引导你敲各种命令神马的

2、记录运行轨迹

先设置以下两项配置

#开启自动跟踪回溯
xdebug.auto_trace=on #设置回溯信息输出目录
xdebug.trace_output_dir="E:\xdebug"

然后通过浏览器访问任何一个http入口脚本,脚本内容可以复制我下面的演示代码:

$str = 'abc';
$str1 = substr($str, 0, 2); function xx($a, $b){
$x = array();
array_push($x, $a);
array_push($x, $b);
yy();
return $x;
} function yy(){
print_r(123);
}

运行后就会在回溯信息输出目录下产生类似这样的一个文件

而打开它文件内容则是这样的:

内容中每一行都显示了在哪个文件的哪一行执行了哪个函数,其中你注意一下第1次出现的array_push函数相对于上一行的xx函数缩进了的,这意思是说array_push函数是在xx函数里面执行的


换成运行你自己的项目代码,相信就能看到成千上万行回溯代码了,包括调用了哪个对象的哪个方法也是这么看

这个回溯追踪的好处是你如果平时发现页面突然变空白了,怎么输出东西都看不见,于是只要通过这个回溯追踪调试,看看输出信息文件的最后几行调用的函数和文件行号你就大概知道出错位置在哪里了

最后提醒:它只记录有函数执行的地方,没有函数执行的地方是不会语录的,比如echo,include,isset等语句是不会记录的,于是你也能从中确认哪些是函数,哪些是语句了

3、设置文件名

默认情况下生成的文件名是类似trace.150145005.xt的,我个人觉得这样命名并不友好,起码就算你重复运行其它脚本都是将调试信息记录到这个文件中的,如果想为每个不同的脚本做不同的记录就要先复制备份开,再运行让它产生新的同名文件了

所以我们要通过xdebug.trace_output_name配置项来设置调试信息的文件名

样本配置:

xdebug.auto_trace=on
xdebug.trace_output_dir="E:\xdebug"
xdebug.collect_params=0
#重点是下面这个,值为%R表示以请求地址来命名,这样不同地址就会有不同的调试信息文件
xdebug.trace_output_name="%R"

然后访问http://xxx.com/a.php就会产生_a_php.xt这个文件

而且同一个入口地址不同参数都会不同喔,你试试访问http://xxx.com/a.php?x=y就会产生_a_php_x=y.xt这个文件

下面我列出所有命名参数

参数 含义 例子 命名结果
%c 以URL中文件目录的CRC32运算结果命名 trace.%c trace.1258863198.xt
%p 以进程PID命名 trace.%p trace.5174.xt
%r 以随机数命名 trace.%r trace.072db0.xt
%s 入口脚本名称,实际上我测试结果是不会生成文档,原因暂时不明 cachegrind.out.%s cachegrind.out._home_httpd_html_test_xdebug_test_php
%t 以时间戳命名 trace.%t trace.1179434742.xt
%u 以毫秒级时间戳命名 trace.%u trace.1179434749_642382.xt
%H 以$_SERVER['HTTP_HOST']这个域名命名 trace.%H trace.kossu.xt
%R 以$_SERVER['REQUEST_URI']这个URI部分命名 trace.%R trace._test_xdebug_test_php_var=1_var2=2.xt
%U 以$_SERVER['UNIQUE_ID']这个唯一的请求ID来命名 trace.%U trace.TRX4n38AAAEAAB9gBFkAAAAB.xt
%S 以session_id命名,但前提是cookie中有PHPSESSIONID trace.%S trace.c70c1ec2375af58f74b390bbdd2a679d.xt
%% 以两个百分号命名,我看不懂加这个命名方式有何意义,求教大神啊! trace.%%

trace.%%.xt

4、记录函数参数

有时候你即使有了回溯也看不出"为什么程序会这样调用,怎么计算进来的"

于是可以尝试开启函数参数记录来看看每一次调用函数时,传给那些函数的参数都是什么,那么结果能进一步明了

  • 复制如下配置

    xdebug.auto_trace=on
    xdebug.trace_output_dir="E:\xdebug"
    #通过设置collect_params选项值为3开启参数记录
    xdebug.collect_params=3

于是跑一趟代码下来,调试信息文件内容就是这样的,看到了吧,函数的括号里多了参数,而没有开启collect_params时函数后面只有一个空括号的

5、手动触发记录

请求参数触发

如果配置xdebug.auto_trace=on的话,你运行任何PHP文件都会产生回溯记录

但有时候你只需要回溯某一个地址的运行轨迹,可以通过设置xdebug.trace_enable_trigger=on来实现,但前提是要设置xdebug.auto_trace=off(或者删除这个选项))

配置样本:

xdebug.auto_trace=off
xdebug.trace_enable_trigger=on
xdebug.trace_output_dir="E:\xdebug"

这样你访问/index.php不会产生回溯记录,但是你如果修改一下URL参数,加上XDEBUG_TRACE这个参数名,不用参数值,只要有参数名就行了

就是访问这样的/index.php?XDEBUG_TRACE地址,然后就会产生文件了,这就是通过GET参数触发

而通过POST请求也是这样,如果你的POST参数中带有XDEBUG_TRACE才会有回溯

$.ajax({
url : '/index.php',
type : 'post',
data : {
a : 1,
XDEBUG_TRACE : 11 //这个值随便设置,如果你不设置就不会POST这个字段上去!
}
});

函数触发

在测试前请先确认配置xdebug.auto_trace=off(关闭自动回溯)

然后找到你要开始追踪回溯的代码位置调用xdebug_start_trace函数,再在要停止追踪回溯的位置调用xdebug_stop_trace函数,这样就会生成回溯信息,并且是对你开始和结束trace函数之间的代码进行记录,其它无关的代码是不记录的

样例代码:

$str = 'abc';
$str1 = substr($str, 0, 2);
xx('a', 'b'); function xx($a, $b){
xdebug_start_trace(); //开始记录回溯
$x = array();
array_push($x, $a);
print(222);
array_push($x, $b);
xdebug_stop_trace(); //结束记录回溯
yy();
return $x;
} function yy(){
print_r(123);
}

并且要注意,通过函数触发的话并不需要什么配置,你只要开启了扩展就可以,就是只保留zend_extension="xdebug.dll"就可以,其它xdebug的相关配置可以完全不配置,如果有文件名定制需求就再保留xdebug.trace_output_name选项就足够了

然而如果你开启了xdebug.auto_trace其实相当于让PHP启动时就自动执行xdebug_start_trace函数,于是会报错说这个函数已经执行过了,所以为避免麻烦请不要开启xdebug_start_trace

这个调试更加精准,因为如果整个运行周期都回溯下来,起码有成千上万行,查找成为了艰难的事情

而函数触发时就缩小了你需要的范围,查找就快捷了很多!

6、记录返回值

记录了函数参数还不足够,想要记录每一次函数的返回值也可以,设置xdebug.collect_return=on

以下是我的演示代码:

$str = 'abc';
$str1 = substr($str, 0, 2);
xx('a', 'b'); function xx($a, $b){
$x = array();
array_push($x, $a);
print(222);
array_push($x, $b);
yy();
return $x;
} function yy(){
print_r(123);
}

运行后所得出的调试信息如下

其中>=>符号后面的值就是相关函数的返回值,然而并不是每一次>=>的值都是上一行调用的返回值,至于它是属于谁的返回值,还要看我红色线所连接的行

比如>=> array (0 => 'a', 1 => 'b')则表示-> xx('a', 'b') E:\test\index.php:4的返回值,并且大家细心的话一定能发现它们的缩进是一样的

PHP Xdebug调试专题的更多相关文章

  1. 用netbeans和xdebug调试php的配置

    xdebug的chrome.firefox插件 chrome:Xdebug helper firefox:easy Xdebug ----------------------------------- ...

  2. zend stuido 12.5的插件安装和xdebug调试器的配置和和配置注意

    参考: zend stuido 12.5的插件安装 zend 12.5 安装插件是按类别进行分类了的, 而且是在欢迎 界面就可以直接安装, 安装后,要重启zend才能生效 版式设计的一个基本点就是: ...

  3. 关于用netbeans和xdebug调试php的配置

    之前用过一段时间在apache,netbeans下通过xdebug调试.感觉不错,最近事情不多想从新配置下,是基于最新版本的php5.4做的,后来参考了下xdebug的官网说明完成的.官网地址:htt ...

  4. 使用zend studio配置Xdebug调试PHP教程

    这里看过上面的文章后写一下自己的想法. 最近安装了zend studio 10.5,下载了破解文件.开始是下载了10.0的版本,但是注册码不正确.所以只能安装最新的10.5了. 接下来进行PHP代码调 ...

  5. 用Eclipse+xdebug调试PHP总是在首行自动断点解决方法

    问题描述: 使用Eclipse+PDT+xdebug调试PHP程序时,总是在程序的第一行(首行)自动断点,不方便调试. 解决方法: 分别在下面3个位置配置,取消 Break at First Line ...

  6. wamp下安装php的xdebug调试的方法

    wamp下安装php的xdebug调试的方法 将下载好的php_xdebug-2.1.2-5.2-vc6.dll放在D:/wamp/php/ext/php_xdebug-2.1.2-5.2-vc6.d ...

  7. IDEA+PHP+XDebug调试配置

    XDebug调试配置 临时需要调试服务器上的PHP web程序,因此安装xdebug,下面简单记录 安装xdebug 下载最新并解压 wget https://xdebug.org/files/xde ...

  8. 使用phpStorm编辑器进行PHP代码的xdebug调试

    首先需要安装Xdebug,如果没有安装可以查看PHP断点调试工具Xdebug的安装这篇文章.phpStorm是开发者经常用的一款编辑器,当然也支持Xdebug调试,下面说一下配置步骤. phpStor ...

  9. PhpStorm 破解及 XDebug 调试

    PhpStorm 破解及 XDebug 调试 PhpStorm 破解 PhpStorm 10.0.2 破解 地址:http://jingyan.baidu.com/article/20095761cb ...

随机推荐

  1. android 调试 native 程序的方法

    一.背景 首先说需求,这个需求非常常见,就是android上需要的一个功能,linux已经有开源代码而且非常稳定,希望能直接porting过去使用,这个程序是pure c 的代码,也就是说,跟andr ...

  2. SQLAlchemy中filter()和filter_by()有什么区别

    from:https://segmentfault.com/q/1010000000140472 filter: apply the given filtering criterion to a co ...

  3. JSOI2016酱油记

    高一,第一次参加NOIP. 后悔初中没有报过名...唉,后悔也来不及了. 不知道自己一个暑假干了什么...算法没学多少,脑子倒是越来越不好使了. 过了初赛,数周后一脸茫(meng)然(bi)地去考场. ...

  4. [转]C++ 指针和引用

    转自http://www.cnblogs.com/tangxiaobo199181/ 作者:算法生活 微信公众号:算法生活 出处:http://www.cnblogs.com/tangxiaobo19 ...

  5. 【SQL】宿主语言接口

    一般情况下,SQL语句是嵌套在宿主语言(如C语言)中的.有两种嵌套方式: 1.调用层接口(CLI):提供一些库,库中的函数和方法实现SQL的调用 2.直接嵌套SQL:在代码中嵌套SQL语句,提交给预处 ...

  6. selenium 3.0鼠标事件 (java代码)

    注意:ActionChains下相关方法在当前的firefox不工作,建议使用谷歌浏览器. public static void main(String[] args) throws Interrup ...

  7. Selenium2+python自动化61-Chrome浏览器(chromedriver)【转载】

    前言 selenium2启动Chrome浏览器是需要安装驱动包的,但是不同的Chrome浏览器版本号,对应的驱动文件版本号又不一样,如果版本号不匹配,是没法启动起来的. 一.Chrome遇到问题 1. ...

  8. 直接利用本地git上传项目到github

    http://m.blog.csdn.net/article/details?id=50441442 本文将详细介绍如何托管你的项目到github上   转载请标明出处: http://blog.cs ...

  9. CF 1006B Polycarp's Practice【贪心】

    Polycarp is practicing his problem solving skill. He has a list of n problems with difficulties a1,a ...

  10. HDFS API 学习:几个常用的API

    1.Hadoop-1.2.1 API 文档:http://hadoop.apache.org/docs/r1.2.1/api/ 2.几个API: create(Path f) :Opens an FS ...