教程集 www.jiaochengji.com
教程集 >  脚本编程  >  php  >  正文 PHP中利用Xdebug进行远程错误调试

PHP中利用Xdebug进行远程错误调试

发布时间:2016-10-13   编辑:jiaochengji.com
教程集为您提供PHP中利用Xdebug进行远程错误调试等资源,欢迎您收藏本站,我们将为您提供最新的PHP中利用Xdebug进行远程错误调试资源
本人自己电脑也安装了Xdebug我可以通过Xdebug来调试php页面程序报错具体行,下面来给各位介绍的是Xdebug进行远程错误调试。
Xdebug提供了客户端与PHP脚本进行交互的接口,这一章将会介绍如何让PHP和Xdebug开启这个特性,并且介绍一些常用的客户端。

概述

Xdebug(远程)调试器允许测试数据结构,步进并且调试你的代码。Xdebug提供了两种协议用于与其进行交互:在Xdebug1.3和2中旧的<code>GDB协议</code>和Xdebug2中实现的<code>DBGp协议</code>。

客户端

Xdebug2 为DBGp协议提供了一个简单的基于命令行的客户端,当然,也有一些其它的客户端实现(免费的和商业的)。我不是这些客户端的作者,所以请到作者的网站寻找使用帮助。

<ul> <li>Dev-PHP (IDE: Windows)</li> <li>Eclipse plugin, which has been submitted as an enhancement for the PDT (IDE).</li> <li>Emacs plugin (Editor Plugin).</li> <li>ActiveState's Komodo (IDE: Windows, Linux, Mac; Commercial).</li> <li>MacGDBP - Standalone Mac client.</li> <li>NetBeans (IDE: Windows, Linux, Mac OS X and Solaris.</li> <li>Notepad plugin (Editor: Windows).</li> <li>WaterProof's PHPEdit (IDE, from version 2.10: Windows; Commercial).</li> <li>Anchor System's Peggy (IDE: Windows, Japanese; Commercial).</li> <li>MP Software's phpDesigner (IDE: Windows, Commercial).</li> <li>PHPEclipse (Editor Plugin).</li> <li>JetBrain'sPhpStorm (IDE; Commercial).</li> <li>Protoeditor (Editor: Linux).</li> <li>tsWebeditor (Editor: Windows).</li> <li>Xored's TrueStudio IDE (IDE; Commercial).</li> <li>VIM plugin (Tutorial) (Editor Plugin).</li> <li>jcx software's VS.Php (MS Visual Studio Plugin; Commercial).</li> <li>XDebugClient - Standalone Windows client.</li> </ul>
Xdebug1.3也带有一个基于GDB协议的简单的命令行客户端。

启动调试器

为了启用Xdebug的调试器,你需要在<code>php.ini</code>文件中做一些配置。这些配置包含<code>xdebug.remote_enable</code>用来允许调试器,<code>xdebug.remote_host</code>和<code>xdebug.remote_port</code>指定调试器应该连接到的IP地址和端口号。如果你希望调试器能够在发生错误(php错误或者异常)的时候初始化一个session的话,你需要修改<code>xdebug.remote_mode</code>配置,该配置项允许的值有<code>req</code>(默认)让调试器在所有脚本开始执行的时候初始化session或者是<code>jit</code>让发生错误的时候才初始化一个session。

当完成以上配置之后,你会发现在脚本运行的时候,Xdebug并没有自动的开启一个调试会话。你还需要按照下面的方法激活Xdebug的调试器。
<ol> <li>
当从命令行运行脚本的时候,你需要设置一个环境变量,如下面所述
<pre>export XDEBUG_CONFIG="idekey=session_name" php myscript.php</pre>
你也可以配置<code>xdebug.remote_host</code>, <code>xdebug.remote_port</code>, <code>xdebug.remote_mode</code>和<code>xdebug.remote_handler</code> 这些选项:
<pre>export XDEBUG_CONFIG="idekey=session_name remote_host=localhost profiler_enable=1"</pre>
这里你设置的这些所有的配置项也可以在php.ini文件中进行设置。
</li> <li>
如果你希望通过调试一个通过浏览器访问的脚本,只需要在访问的参数中添加<code>XDEBUG_SESSION_START=session_name</code>作为参数传递即可,再下一章节中你将看到一个调试会话如何从浏览器窗口中工作。
</li> <li>
另一种方法激活xdebug是在浏览器运行时通过安装以下三个浏览器扩展之一。下面的每一个扩展都允许你通过单击个按钮就可以开启调试器。 这些扩展如下:
<ul> <li>最简单的Xdebug 
这个扩展是Firefox上用于使得与IDE一起调试起来更加容易。你可以在https://addons.mozilla.org/en-US/firefox/addon/the-easiest-xdebug/上找到这个扩展.</li> <li>Xdebug Helper for Chrome 
这个扩展是运行在Chrome浏览器上的,它将会帮助你通过点击一下按钮就可以允许/禁止调试和性能分析T。你可以在https://chrome.google.com/extensions/detail/eadndfjplgieldjbigjakmdgkmoaaaoc找到这个扩展.</li> <li>Xdebug Toggler for Safari 
这个扩展是运行在Safari上的,允许你在Safari中自动的开始Xdebug调试过程,你可以在Github上找到这个扩展https://github.com/benmatselby/xdebug-toggler.</li> <li>Xdebug launcher for Opera 
这个扩展是运行在Opera上的,它允许你在Xdebug上开启一个Xdebug会话。</li> </ul> </li> </ol>
在开始执行脚本之前,首先需要告诉客户端可以接收调试连接,请查看您使用的客户端的文档以获取如何这样去做。要使用绑定的客户端,首先需要 安装 它,安装完成后你可以通过运行命令"<code>debugclient</code>"命令。如果你希望使用GDB命令集去调试你的脚本,你需要确定你使用的是Xdebug1.3绑定的客户端。
当debugclient开始运行之后,它将会显示以下信息,并且等待来自等待直到debug服务器连接到来以便进行初始化:
<pre>Xdebug Simple DBGp client (0.10.0) Copyright 2002-2007 by Derick Rethans. - libedit support: enabled Waiting for debug server to connect.</pre>
在连接完成后,debug服务器将会显示下面的输出:
<pre>Connect <?xml version="1.0" encoding="iso-8859-1"?> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/xdebug" fileuri="file:///home/httpd/www.xdebug.org/html/docs/index.php" language="PHP" protocol_version="1.0" appid="13202" idekey="derick"> <engine version="2.0.0RC4-dev"><![CDATA[Xdebug]]></engine> <author><![CDATA[Derick Rethans]]></author> <url><![CDATA[http://xdebug.org]]></url> <<opyright><![CDATA[Copyright (c) 2002-2007 by Derick Rethans]]></copyright> </init> (cmd)</pre>

 

下来你就可以使用 DBGp 文档中描述的命令集进行操作了。 当脚本执行结束的时候,调试服务器将会断开与客户端的连接,并且还原到等待新的连接请求的状态。

连接建立

对于有静态IP、单个开发者

使用Xdebug的远程调试,Xdebug作为一个嵌入到PHP的程序,扮演着客户端的角色,而IDE则作为服务器。下面的动态图展示了连接建立的过程。

连接建立过程
<ul> <li>服务端的IP为10.0.1.2, 使用HTTP协议,端口为80</li> <li>IDE在IP地址为10.0.1.42的机器上,<code>xdebug.remote_host</code>被设置为10.0.1.42</li> <li>IDE监听9000端口,因此,<code>xdebug.remote_port</code>设置为9000</li> <li>HTTP请求从运行这IDE的服务器上发起</li> <li>Xdebug连接到10.0.1.42:9000</li> <li>调试开始运行,返回HTTP响应</li> </ul>

使用非固定IP,多个开发者

如果使用了<code>xdebug.remote_connect_back</code>指令的话,连接的建立过程是不同的:

连接建立过程
<ul> <li>服务端的IP是10.0.1.2, 端口为80</li> <li>IDE运行在一个动态IP的计算机上,因此设置<code>xdebug.remote_connect_back</code>为1</li> <li>IDE监听端口 9000, 因此,配置<code>xdebug.remote_port</code> 为9000</li> <li>发送HTTP请求,Xdebug检测HTTP header中的IP地址</li> <li>调试开始运行,产生HTTP响应</li> </ul>

HTTP调试会话

当使用浏览器进行Debug的时候,Xdebug支持吃用cookie跟踪会话的功能。

<ul> <li>当参数<code>XDEBUG_SESSION_START=name</code>被附加到URL地址上,Xdebug将会设置一个名为<code>XDEBUG_SESSION</code>,值为参数<code>XDEBUG_SESSION_START</code>指定的名称的Cookie。这个Cookie的过期时间是一个小时。<code>DBGp</code>协议也会在初始化包中传递一个同样的值,这样就可以连接到设置了<code>idekey</code>属性的客户端了。</li> <li>当设置了一个名为<code>XDEBUG_SESSION_START</code>的GET(POST)变量或者<code>XDEBUG_SESSION</code>的Cookie的话,Xdebug将会尝试去连接debugcliet</li> <li>要停止xdebug会话的话,只需要传递一个<code>XDEBUG_SESSION_STOP</code>的参数,然后Xdebug将不会再去尝试连接debugclient。</li> </ul>

多用户调试

Xdebug只允许你使用指定的IP地址(<code>xdebug.remote_host</code>)进行远程调试连接.他不会自动的连接回浏览器运行访问的机器IP,除非你是用<code>xdebug.remote_connect_back</code>指令。

如果你的开发者们在同一个服务器上的不同的项目上面进行开发,你可以使用Apache的每个目录中的<code>.htaccess</code>功能指定<code>xdebug.remote_host</code>指令,配置<code>php_value xdebug.remote_host=10.0.0.5</code>。 但是,如果是多个开发者在同样的代码上进行开发的话,<code>.htaccess</code>将无法完成该项功能。
针对这个问题,这里有两个解决方案。第一个是你可以使用DGBp代理,对于如何使用这个代理,请查看多用户调试这篇文章。你可以在 ActiveState的站点 下载这个代理。这里有更多的文档在Komodo FAQ.
第二个方案是可以使用<code>xdebug.remote_connect_back</code>配置项(Xdebug 2.1之后引入)。

相关配置

 

xdebug.extended_info 
Type: integer, Default value: 1
控制Xdebug是否应该强制PHP解释器使用'extended_info'模式;这使得Xdebug可以使用远程调试器对文件或者行设置断点。当对脚本进行堆栈跟踪或者是性能调试的时候通常希望关闭这个选项,因为为PHP增加的一些调试属性将会减慢脚本的执行,影响最终结果。这个属性只能在<code>php.ini</code>文件中设置,不能够在脚本中通过<code>ini_set()</code>函数进行设置。

 

<ul> <li>
xdebug.idekey 
Type: string, Default value: <em>complex</em>
控制Xdebug应该传递给<code>DBGp</code>调试处理器那一个IDE key。默认情况下是基于环境配置的。首先,环境变量中的<code>DBGP_IDEKEY</code>会被使用,然后是USER和USERNAME。默认会使用在环境变量中第一次发现的配置值,如果找不到配置,则使用默认的''。如果设置了这个选项,它将会覆盖环境变量的配置。
</li> <li>
xdebug.remote_autostart 
Type: boolean, Default value: 0
通常情况下,你需要使用指定的HTTP GET/POST变量去激活Xdebug的远程调试功能。当这个设置为1的情况下,Xdebug将在脚本执行时总是尝试去连接调试客户端,即使没有设置GET/POST/COOKIE变量。=
</li> <li>
xdebug.remote_connect_back 
Type: boolean, Default value: 0, Introduced in Xdebug > 2.1
如果允许的话,<code>xdebug.remote_host</code>设置将会被失效,Xdebug将会尝试连接发送HTTP请求的计算机的调试客户端。他将会检查<code>$_SERVER['REMOTE_ADDR']</code>变量,查找所使用的IP地址。请注意,这里没有可用的过滤器,任何连接到webserver的人都可以开始一个调试会话,即使他们的IP地址与<code>xdebug.remote_host</code>并不相同。
</li> <li>
xdebug.remote_cookie_expire_time 
Type: integer, Default value: 3600, Introduced in Xdebug > 2.1
这个选项用于控制调试会话可用的时间。
</li> <li>
xdebug.remote_enable 
Type: boolean, Default value: 0
这个选项控制是否允许远程调试,如果无法建立连接的话脚本将会继续执行,就像这个配置的值为0一样。
</li> <li>
xdebug.remote_handler 
Type: string, Default value: dbgp
这个值可以是<code>php3</code>,用于使用旧式的PHP 3样式的调试输出,<code>gdb</code>用于允许使用GDB的调试器接口或者<code>dbgp</code>协议。<code>DBGp</code>协议是唯一支持的协议。
</li> </ul> <table style="background: #fb7" border="0" cellspacing="1" cellpadding="1" width="620" align="center"> <tbody> <tr> <td bgcolor="#ffe7ce" height="27" width="464"> 代码如下</td> <td style="cursor: pointer" bgcolor="#ffe7ce" width="109" align="center" onclick="doCopy('copy1563')">复制代码</td> </tr> <tr> <td style="padding-bottom: 10px; padding-left: 10px; padding-right: 10px; padding-top: 10px" id="copy1563" class="copyclass" bgcolor="#ffffff" valign="top" colspan="2">
注意: Xdebug 2.1 和之后的版本只支持<code>dbgp</code>协议。
</td> </tr> </tbody> </table> <ul> <li>
xdebug.remote_host 
Type: string, Default value: localhost
选择调试客户端运行在那个主机上,这个选项可以使用主机名或者是IP地址。如果<code>xdebug.remote_connect_back</code>选项指定了的花该选项将会被忽略。
</li> <li> <pre>Log opened at 2007-05-27 14:28:15 -> <init xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/dbgp/x ... ight></init> <- step_into -i 1 -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="http://xdebug.org/db ... ></response></pre> </li> <li>xdebug.remote_mode 
Type: string, Default value: req</li> </ul>
选择调试连接什么时候建立。这个选项有两个不同的值:
<code>req</code> 
Xdebug将会当脚本执行开始的时候立即连接到调试客户端。
<code>jit</code> 
Xdebug 只会在脚本发生错误的情况下尝试去连接调试客户端。
<ul> <li>xdebug.remote_port 
Type: integer, Default value: 9000</li> </ul>
Xdebug用于连接客户端的端口号。默认端口为9000.
相关函数
bool xdebug_break()
给调试客户端发送一个断点,这个函数让调试器在指定的行上设置一个断点

您可能感兴趣的文章:
PHP中利用Xdebug进行远程错误调试
phpstorm xdebug远程调试服务器PHP代码
xdebug调试PHP程序的学习笔记
PHP版本升级后代码无法使用
PHP Xdebug PhpStorm调试远程服务器代码
xampp启用xdebug学习笔记详解
php中在虚拟机环境下使用xdebug注意事项
避坑!用 Docker 搞定 PHP 开发环境搭建
常用php代码开发工具有哪些?
PHPStorm解决Xdebug Slow问题

[关闭]
~ ~