PHP使用Xdebug进行远程调试

翻译 by mylxsw posted on 2014/07/14 under 技术文章 > 编程语言

Xdebug提供了客户端与PHP脚本进行交互的接口,这一章将会介绍如何让PHP和Xdebug开启这个特性,并且介绍一些常用的客户端。

概述

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

客户端

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

  • Dev-PHP (IDE: Windows)
  • Eclipse plugin, which has been submitted as an enhancement for the PDT (IDE).
  • Emacs plugin (Editor Plugin).
  • ActiveState's Komodo (IDE: Windows, Linux, Mac; Commercial).
  • MacGDBP - Standalone Mac client.
  • NetBeans (IDE: Windows, Linux, Mac OS X and Solaris.
  • Notepad++ plugin (Editor: Windows).
  • WaterProof's PHPEdit (IDE, from version 2.10: Windows; Commercial).
  • Anchor System's Peggy (IDE: Windows, Japanese; Commercial).
  • MP Software's phpDesigner (IDE: Windows, Commercial).
  • PHPEclipse (Editor Plugin).
  • JetBrain'sPhpStorm (IDE; Commercial).
  • Protoeditor (Editor: Linux).
  • tsWebeditor (Editor: Windows).
  • Xored's TrueStudio IDE (IDE; Commercial).
  • VIM plugin (Tutorial) (Editor Plugin).
  • jcx software's VS.Php (MS Visual Studio Plugin; Commercial).
  • XDebugClient - Standalone Windows client.

Xdebug1.3也带有一个基于GDB协议的简单的命令行客户端。

启动调试器

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

当完成以上配置之后,你会发现在脚本运行的时候,Xdebug并没有自动的开启一个调试会话。你还需要按照下面的方法激活Xdebug的调试器。

  1. 当从命令行运行脚本的时候,你需要设置一个环境变量,如下面所述

    export XDEBUG_CONFIG="idekey=session_name"
    php myscript.php

    你也可以配置xdebug.remote_hostxdebug.remote_portxdebug.remote_modexdebug.remote_handler 这些选项:

    export XDEBUG_CONFIG="idekey=session_name remote_host=localhost profiler_enable=1"

    这里你设置的这些所有的配置项也可以在php.ini文件中进行设置。

  2. 如果你希望通过调试一个通过浏览器访问的脚本,只需要在访问的参数中添加XDEBUG_SESSION_START=session_name作为参数传递即可,再下一章节中你将看到一个调试会话如何从浏览器窗口中工作。

  3. 另一种方法激活xdebug是在浏览器运行时通过安装以下三个浏览器扩展之一。下面的每一个扩展都允许你通过单击个按钮就可以开启调试器。 这些扩展如下:

在开始执行脚本之前,首先需要告诉客户端可以接收调试连接,请查看您使用的客户端的文档以获取如何这样去做。要使用绑定的客户端,首先需要 安装 它,安装完成后你可以通过运行命令"debugclient"命令。如果你希望使用GDB命令集去调试你的脚本,你需要确定你使用的是Xdebug1.3绑定的客户端。

当debugclient开始运行之后,它将会显示以下信息,并且等待来自等待直到debug服务器连接到来以便进行初始化:

Xdebug Simple DBGp client (0.10.0)
Copyright 2002-2007 by Derick Rethans.
- libedit support: enabled Waiting for debug server to connect.

在连接完成后,debug服务器将会显示下面的输出:

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)

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

连接建立

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

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

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

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

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

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

HTTP调试会话

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

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

多用户调试

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

如果你的开发者们在同一个服务器上的不同的项目上面进行开发,你可以使用Apache的每个目录中的.htaccess功能指定xdebug.remote_host指令,配置php_value xdebug.remote_host=10.0.0.5。 但是,如果是多个开发者在同样的代码上进行开发的话,.htaccess将无法完成该项功能。

针对这个问题,这里有两个解决方案。第一个是你可以使用DGBp代理,对于如何使用这个代理,请查看多用户调试这篇文章。你可以在 ActiveState的站点 下载这个代理。这里有更多的文档在Komodo FAQ.

第二个方案是可以使用xdebug.remote_connect_back配置项(Xdebug 2.1之后引入)。

相关配置

  • xdebug.extended_info
    Type: integer, Default value: 1

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

  • xdebug.idekey
    Type: string, Default value: complex

    控制Xdebug应该传递给DBGp调试处理器那一个IDE key。默认情况下是基于环境配置的。首先,环境变量中的DBGP_IDEKEY会被使用,然后是USER和USERNAME。默认会使用在环境变量中第一次发现的配置值,如果找不到配置,则使用默认的''。如果设置了这个选项,它将会覆盖环境变量的配置。

  • xdebug.remote_autostart
    Type: boolean, Default value: 0

    通常情况下,你需要使用指定的HTTP GET/POST变量去激活Xdebug的远程调试功能。当这个设置为1的情况下,Xdebug将在脚本执行时总是尝试去连接调试客户端,即使没有设置GET/POST/COOKIE变量。=

  • xdebug.remote_connect_back
    Type: boolean, Default value: 0, Introduced in Xdebug > 2.1

    如果允许的话,xdebug.remote_host设置将会被失效,Xdebug将会尝试连接发送HTTP请求的计算机的调试客户端。他将会检查$_SERVER['REMOTE_ADDR']变量,查找所使用的IP地址。请注意,这里没有可用的过滤器,任何连接到webserver的人都可以开始一个调试会话,即使他们的IP地址与xdebug.remote_host并不相同。

  • xdebug.remote_cookie_expire_time
    Type: integer, Default value: 3600, Introduced in Xdebug > 2.1

    这个选项用于控制调试会话可用的时间。

  • xdebug.remote_enable
    Type: boolean, Default value: 0

    这个选项控制是否允许远程调试,如果无法建立连接的话脚本将会继续执行,就像这个配置的值为0一样。

  • xdebug.remote_handler
    Type: string, Default value: dbgp

    这个值可以是php3,用于使用旧式的PHP 3样式的调试输出,gdb用于允许使用GDB的调试器接口或者dbgp协议。DBGp协议是唯一支持的协议。

注意: Xdebug 2.1 和之后的版本只支持dbgp协议。

  • xdebug.remote_host
    Type: string, Default value: localhost

    选择调试客户端运行在那个主机上,这个选项可以使用主机名或者是IP地址。如果xdebug.remote_connect_back选项指定了的花该选项将会被忽略。

  • xdebug.remote_log
    Type: string, Default value:

    如果设置了这个值,将会使用它作为文件名,所有的远程调试连接都会被记录到该日志文件中。这个文件总是以追加模式打开,因此,默认情况下不要覆写它。这里没有进行并发保护。日志文件的格式类似于下面:

    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>
  • xdebug.remote_mode
    Type: string, Default value: req

选择调试连接什么时候建立。这个选项有两个不同的值:

req
Xdebug将会当脚本执行开始的时候立即连接到调试客户端。

jit
Xdebug 只会在脚本发生错误的情况下尝试去连接调试客户端。

  • xdebug.remote_port
    Type: integer, Default value: 9000

Xdebug用于连接客户端的端口号。默认端口为9000.

相关函数

bool xdebug_break()

给调试客户端发送一个断点,这个函数让调试器在指定的行上设置一个断点。

PHP使用Xdebug进行远程调试的更多相关文章

  1. PHP - 如何使用XDEBUG来远程调试?

    开发的时候我都是使用XDebug在本地调试,但是最近加入一些项目中去,环境太复杂了,要在本地搭建一个开发环境真的太麻烦了,那么我们怎么使用xdebug来远程调试呢? 我这里使用虚拟机搭建了一个模拟环境 ...

  2. 使用phpstorm和xdebug实现远程调试

    使用phpstorm和xdebug实现远程调试 2012-05-23 10:06:35 vs的断点调试功能很强大有木有,能查看所有变量有木有.php调试很麻烦有木有,echo,var_dump写得你想 ...

  3. 使用xdebug+eclipse远程调试centOS7上的PHP代码

    这两天一直在研究PHP代码的调试,原来开发一直用的var_dump,麻烦! 最近发现能使用xdebug+eclipse远程单步调试PHP,但是百度后实现此技术的文章都写得不够具体. 我照着这里零散的文 ...

  4. PHP+Xdebug实现远程调试

    以前以为php调试时服务器端和IDE必须在同一台机子上,无意发现xdebug其实是支持远程调试的. 尝试之后发现可以配置成功,还是可以调试代码的感觉爽啊!   php所在Ubuntu服务器       ...

  5. PHPStorm+Xdebug断点远程调试PHP xdebug安装

    一.xdebug安装 wget http://www.xdebug.org/files/xdebug-2.2.3.tgz #下载Xdebug tar xzf xdebug-2.2.3.tgz cd x ...

  6. [视频教程] 配置vscode的PHP自动补全提示与使用Xdebug进行远程调试debug

    默认下载安装完的vscode并不能准确提示和检测PHP的语法错误,需要手动指定一下本机的PHP程序路径.按下面的操作配置完后就能在文件保存的时候检测语法有无错误.打开文件->首选项->se ...

  7. php+xdebug+dbgp远程调试(多人)

    目录 创建 DBGP 服务 配置 调试 创建 DBGP 服务 到 下载页面,下载 python 版本的 dbgp 到服务器上. 解压后执行 pydbgpproxy. 如果提示找不到 dbgp 模块,则 ...

  8. Xdebug文档(七) 远程调试

    Xdebug提示调试客户端接口与PHP运行相联系.该章节解释如何设置PHP与xdebug,并推荐一些客户端. 介绍 Xdebug的远程调试器允许你检查数据结构,交互式地穿过和调试你的代码.该协议已经开 ...

  9. XDEBUG 远程调试

    我的PHP环境是安装在虚拟机中.真机系统用的是windows.那么我要用XDEBUG调试代码,就得用XDEBUG的远程调试功能. 首先要给远程环境中安装XDEBUG扩展,具体方法:http://www ...

随机推荐

  1. SPI的通信试验 --verilog (从机-全双工)

    SPI的 有关知识参考FPGA作为主机的通信实验. 本实验中FPGA作为从机通过SPI与MCU等通信的试验,可以在时钟上升沿接收数据并且在时钟下降沿发送数据,模仿全双工模式.接收的 数据作为地址,通过 ...

  2. 如何从Apache官网下载windows版apache服务器

    参考文章:http://jingyan.baidu.com/article/29697b912f6539ab20de3cf8.html

  3. css div 清理浮动的2种方法

    使用float属性,导致div的内容发生浮动,浮动带来负影响: 1.背景不能显示 2.边框撑不开 3.div的padding和margin不能起作用: 处理float浮动的两种方式: 1.div的子类 ...

  4. Java Hour 20 Spring

    有句名言,叫做10000小时成为某一个领域的专家.姑且不辩论这句话是否正确,让我们到达10000小时的时候再回头来看吧. 本文作者Java 现经验约为20 Hour,请各位不吝赐教. 今天心情不佳,只 ...

  5. hdu 2191 完全背包

    为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买.请问:你用有限的资金最多能采购多少 ...

  6. ToggleButton

    <ToggleButton android:id="@+id/toggle" android:layout_width="wrap_content" an ...

  7. c# 使用正则表达式 提取章节小说正文全本篇

    这一节主要内容是使用正则表达式提取网站的正文,主要面向于小说章节网站.其中涉及到一些其他知识点,比如异步读取.异步流写入等,代码中都会有详细的注解.现在流行的网络文学都是每日一更或几更,没有一个统一的 ...

  8. http://www.open-open.com/lib/view/open1397274257325.html

    http://www.open-open.com/lib/view/open1397274257325.html

  9. TV测试中的按键长按操作模拟

    从UiAutomator在TV测试中的局限性说起: 智能TV的操作和手机的操作有很大不同,一般智能TV的操作为遥控器按键操作,来向TV OS发送  KeyCode,以完成指定操作. UiAutomat ...

  10. Java线程之CompletionService

    转自:http://blog.csdn.net/andycpp/article/details/8902699 当使用ExecutorService启动了多个Callable后,每个Callable会 ...