图片 17

远程调试,配置本地调试环境

DBGPavim相对于其他插件的优势

DBGPavim源于VIM早期的一个DBGp插件

DBGPavim会监听所有来自DBGp客户端如XDebug、pydbgp的DBGp连接,不像其它插件只能捕获第一个连接。这对于大规模的WEB程序是必须的,因为现在的一次网页加载通常会触发多个HTTP请求,而我们需要调试的可能来自其中的任何一个。
同时DBGPavim支持只在断点处停下,其它的插件都是在入口处停下,需要程序员一步步跟踪进去。这省了开发人员很大的麻烦,而且避免出错后一次次的重启调试。

相信你也已经发现,DBGPavim可以与Windows下的GVIM一起工作,并且工作的很好。

(cmd)

四、PhpStorm IDE配置

  • XDebug相对于Eclipse + XDebug也有不少优势,将在文章讲述。

     

  1. 设置 PHP 版本,选择本地环境的 php 版本。

    图片 1PHP
    版本设置

  2. XDebug 端口设置,这里设置成 php.ini 中 xdebug 配置的端口

    图片 2XDebug
    端口设置

  3. DBGp proxy 设置

    图片 3DBGp
    代理设置

  4. Servers 服务配置Servers 配置,点 +
    号新增配置。注意勾选路径匹配,并配置项目所在本地绝对路径。

    图片 4Servers
    配置

  5. 编辑运行/调试配置

    图片 5Run/Debug
    编辑

    添加 Run/Debug 配置

    图片 6添加
    Run/Debug 配置

  6. PhpStorm
    打开请求监听开启请求监听![_]F9{FRS@L_8VIGE4KD@_9P.png]()

调试命令行启动的PHP程序

如果你需要调试命令行启动的PHP程序,也需要保证PHP程序端的设置是正确的。这些设置可以像前面一样在php.ini中设定,也可以通过命令行参数来设定。比如:

php -dxdebug.remote_autostart=1 -dxdebug.remote_port=9009 test.php

如果你的命令行使用的ini和apache中php5_module使用的ini是一样的(通常情况是这样的),你不需要在参数中再来做这些设置。但如果你在ini中的设置是放在某个virtualhost段里,你仍然需要加上这些设置。
你可以通过命令行:

php --ini

来查看你的命令行用的是哪个ini。

接着你可以使用命令:

php -r "phpinfo();"|grep xdebug.remote_

来检查你的XDebug设置。

基本步骤如下:

  1. 用VIM打开你需要调试的PHP文件,F10设置断点,F5启动调试监听。
  2. 从命令行运行php程序如上。
  3. 回到你的VIM窗口,将看到提示信息为PEND-1。
  4. 按F5进入调试模式。

DBGPavim提供一个:Dp命令简化命令行程序的调试。只需打开你的PHP文件,输入命令:Dp即可。

      appid=”13202″

配置VIM + DBGPavim

DBGPavim插件本身是用Python实现的,所以需要你的VIM支持Python
2.7。打开你的VIM,输入命令

:version

如果能看到“+python”,说明你的VIM是支持Python的。
如果看到的是“-python”,说明你的VIM不支持Python,你可以按如下步骤编译自己的VIM:

  1. 安装Python 2.7
  2. export path=/path/to/python2.7/bin:$PATH
  3. 用以下命令编译VIM:

 ./configure --prefix=/opt/vim --enable-pythoninterp --with-python-config-dir=/usr/lib/python2.7/config
 make
 make install

注:这里的/usr/lib/python2.7/config取决于你把Python2.7安装到什么位置。

从这里或者这里下载DBGPavim,放到你的~/.vim目录下,并编辑的你的~/.vimrc,加入以下两行:

let g:dbgPavimPort = 9009
let g:dbgPavimBreakAtEntry = 0

注:这里的9009和上一节的9009要一致,如果上一节没有配置xdebug.remote_port,这里也不需要配置,因为它们都会使用默认的9000。
dbgPavimBreakAtEntry=0告诉VIM不在入口处停下,这样只会在断点处停下。

你可以重新启动VIM,按F5检查你的DBGPavim配置是否正确。如果你配置成功的话,你会做VIM窗口的右下角看到提示信息如下:

bap-LISN-9009

它表示VIM目前正在监听9009端口,bap说明它只会在断点处停下,其他提示信息格式如下:

<bae|bap>-<LISN|PENDn|CONN|CLSD>

断点状态

bae Break At Entry,在入口处停下
bap Break only At breakPoints,只在断点处停下

调试器状态

LISN 调试器已启动,正处于监听状态。
PEND-n  调试器已捕捉到连接请求,可以按F5进入调试模式了。
CONN    VIM正处于调试模式中。
CLSD    调试器已停止。

  <engine
version=”2.0.0RC4-dev”><![CDATA[Xdebug]]></engine>

调试Python程序

前面说过VIM +
DBGPavim作为DBGp协议的服务器,可以与XDebug协同工作,也可以与ActiveState提供的Komodo
Python Remote Debugging
Client协同工作,实现Python程序的调试,具体步骤如下:

  1. 从这里下载安装Komodo
    Python Remote Debugging
    Client,把解压后的bin目录加到你的PATH路径中,注意bin目录下的pydbgp文件。
  2. 用VIM打开你需要调试的Python文件,F10设置断点,F5启动调试监听。
  3. 通过pydbgp运行你的Python程序,如

     pydbgp -d 127.0.0.1:9009 test.py
    
    1. 注:这里的9009端口就相当于上面为PHP调试时设置的xdebug.remote_port,需要和dbgPavimPort保持一致。
    2. 回到你的VIM窗口,将看到提示信息为PEND-1。
    3. 按F5进入调试模式。

    上面的:Dp命令同样适用于Python调试,下图为Windows 7下用GVIM +
    pydbgp调试Python的截图。 图片 7

    ### VIM + DBGPavim相对于Eclipse + XDebug的优势

    大多数服务器不会启动XServer,无法在服务器上启动Eclipse。如果在开发人员工作机上启动Eclipse +
    XDebug,就相当于把DBGp服务器在工作机上运行,你需要设置路径映射,也就是HTTP
    Server执行的一份代码在服务器上,Eclipse调试时打开的是一份代码,在工作机上,要保证这两份代码能对应上需要映射路径。当程序规模不大时,问题不大,当程序规模大时,会比较麻烦,而且要保证代码的同步,否则会串行。

    同时可以遭遇网络防火墙之类的问题。

    VIM +
    DBGPavim也是支持远程调试的,但同样避免不了路径映射的设置,如下:

    let g:dbgPavimPathMap = [['D:/works/php','/var/www'],]
    

HTTP调试会话

PHP
开发的时候,频繁的调试,总是打印感觉效率太低了,能不能像编译型语言一样断点调试呢?当然可以,只是需要进行一些配置,稍显麻烦。

DBGPavim的详细使用参考

VIM normal模式下

F5   启动调试监听,或者有可调试连接时进入调试模式。
F6  停止调试监听。
F8  切换dbgPavimBreakAtEntry的值,按这个键你可以看到状态栏提示信息在bae和bap之间切换,即是否在PHP程序入口处停下。
F10 在当前行设置或删除断点,在调试模式下同样适用。

调试模式下

F1   打开或关闭帮助窗口
F2  单步进入
F3  单步跳过
F4  单步退出
F5  继续执行直到下一个断点,如果后续没有断点就退出调试模式。
F6  停止调试,这个按键就导致VIM退出调试模式,并且停止调试监听。
F7  调试时执行php语句,按下F7后,用户可在变量查看窗口输入php语句,回车后执行。
F9  最大化某个子窗口,或者重置窗口布局。
F11 查看当前执行环境下的所有变量的值,在不同的堆栈层次,会有不同的结果。
F12 查看光标下的变量的值。

以上功能键为默认配置,你如果习惯多数浏览器的按键设置,可以把下面的代码加入你的.vimrc中:

let g:dbgPavimKeyRun = '<F8>'
let g:dbgPavimKeyStepOver = '<F10>'
let g:dbgPavimKeyStepInto = '<F11>'
let g:dbgPavimKeyStepOut = '<F12>'
let g:dbgPavimKeyPropertyGet = '<F3>'
let g:dbgPavimKeyContextGet = '<F4>'
let g:dbgPavimKeyToggleBp = '<F9>'
let g:dbgPavimKeyToggleBae = '<F5>'
let g:dbgPavimKeyRelayout = '<F2>'

VIM命令,所有命令只有第一个字母为大写。

:Bl  列出所有断点
:Bp 与F10功能相同  p   这个命令可用于快速调试当前文件,它实现了如下功能:

    1. 检查命令行下XDebug/pydbgp的设置是否正确
    2. 启动调试器监听
    3. 用php/pydbgp执行当前文件
  g <longfoo> 查看较长变量的值,比如:Pg $this->savings[3]
:Up 调用堆栈往上一级  n  调用堆栈往下一级
:Wc [$foo]  打开/关闭对变量$foo的监视。如果没有参数,就监视当前执行环境下的所有变量。
:We <foo> 打开/关闭对语句foo的监视,即每一单步后自动执行foo语句。
:Wl 列出所有被监视的变量或语句。
:Children <n> 对于数组默认显示前1024个元素,这个命令可以修改。  epth <n> 对于复杂变量,默认只显示下一层成员,这个命令可以设置限制多层。
:Length <n>   对于字符串变量,默认执行显示前1024个字符,这个命令可以设置显示长度。

当调试客户端启动,它会显示以下信息并等待连接被调试服务器接收:

  1. 浏览器访问调试代码中打几个断点,浏览器中访问 e.com。

    图片 8Paste_Image.png

  2. Postman 中访问调试Postman 中 post、put
    等请求调试需要添加默认参数:XDEBUG_SESSION_START=PHPSTORM

    图片 9post
    请求调试图片 10post
    请求调试结果

在Apache环境下调试PHP

  1. 现在确认配置正确后,可以用VIM打开你需要调试的文件,跳到你需要调试的行,按F10设置当前行为断点,并按F5启动调试器。
  2. 用浏览器访问会调用相应PHP文件的URL,你会看到VIM状态栏里的的提示信息变成:

     bap-PEND-1
    

  1. 它告诉你已经有一个连接被拦截,可以按F5开始调试了。图片 11
  2. 按F5进入调试模式,你会看到VIM窗口被分成三部分:左上为源码窗口,右上为变量查看窗口,下方为调用堆栈窗口。图片 12在源码窗口里,把光标定位到某一个变量上面按F12,在变量查看窗口就能看到该变量的值,如果该变量不是简单变量,其成员也会显示出来。如果该变量的某个成员仍不是简单变量,该行后面会出现一个加号,在该行按回车键,该成员的值将被继续展开。如果你想直接查看某个变量的成员变量,可以按v切换到visual模式,选中该成员再按F12,比如$this->login。在堆栈窗口,当你在某一行按回车,将跳到该层。最上面一行是最底层,最下面一行是最顶层。切换调用堆栈的层次,可以帮助你查看各个层次的变量,比如有些全局变量只有在最顶层才能看到。对于源码中没有出现的变量,你可以通过命令:Pg来查看,比如:

      g $this->memberShip
    

  1. 你可以开始你的调试了,随时按F1可调出帮助窗口,再次F1就关闭帮助窗口。图片 13

通讯设置

  1. 安装 php_xdebug 扩展后,php.ini 配置 XDebug
    参数,目录参数配置成自己环境的,其他参数说明自行百度或谷歌

配置XDebug

  1. 安装XDebug可以参考
  2. 编辑php.ini,加入以下两行:

    zend_extension=/path/to/xdebug.so
     xdebug.remote_enable=1
    
  3. 编辑你的httpd.conf,加入以下行:

     php_value xdebug.remote_autostart 1
    

如果有多个开发人员同时需要调试不同的VirtualHost,可以在你的VirtualHost段中加入以下行:

 php_value xdebug.remote_port 9009

注:这里的9009就是VIM作为DBGp服务器应当监听的端口,不同的开发人员在不同的VirtualHost中用各自不同的端口号。这个端口号和下一节提到的dbgPavimPort要一致。不加这一行,默认的端口号是9000。
最后可通过phpinfo.php检查你的XDebug配置是否正确,你必须能够看到以下这些行的值如下(主要是前两列):

xdebug.remote_autostart  On  Off
 xdebug.remote_enable   On  On
 xdebug.remote_handler  dbgp    dbgp
 xdebug.remote_host 127.0.0.1   127.0.0.1
 xdebug.remote_port 9009    9000

phpinfo.php文件内容如下:

<?php
     phpinfo();
 ?>

客户端

图片 14示例:e.com

本文主要介绍如何在服务器上用VIM +
XDebug调试PHP程序,目前虽然有不少介绍如何用Eclipse +
XDebug在开发人员工作机上调试PHP的文章,但对于如何系统的配置VIM +
XDebug还是比较少的,而且目前关于VIM设置的文章都用一个比较老的插件。这里主要介绍一个新插件DBGPavim,它相对于老的一些插件有很多优势。同时该插件可完美的用于Python程序的调试。另外VIM

相关设置

 

xdebug.extended_info

类型: integer, 默认值: 1

控制xdebug是否强制性开启PHP解析器的“extended_info”模式,这能让Xdebug在远端调试上做到文件/行号断点调试。当跟踪或分析脚本你通常想关闭此选项,因为PHP产生的数组会增加三分之一的大小减慢你的脚本。该设置只能在php.ini设置,不能在ini_set()内设置。

xdebug.idekey

类型: string, 默认值: \complex**

控制哪种IDE索引值可由xdebug传递到DBGp调试处理器。默认情况下是基于设置环境。首先环境设置DBGP_IDEKEY会被考虑,之后是USER和最后的USERNAME。默认值会是找到第一个环境变量。如果确实找不到则该设置是默认“”。如果该值有设置,它通常覆盖环境变量值。

xdebug.remote_autostart

类型: boolean, 默认值: 0

一般来说要使用一指定的HTTP的GET/POST变量启动远端调试(参考 Remote
Debugging)。当设置为1时,Xdebug会尝试启动一远端调试会话并试图连接到一客户端,即便是GET/POST/COOKIE变量并不存在。

xdebug.remote_connect_back

类型: boolean, 默认值: 0, 始于 Xdebug > 2.1

如果设置生效, xdebug.remote_host 设置会忽略而Xdebug会尝试给制造HTTP请求的客户端进行连接。它会检查$_SERVER[‘REMOTE_ADDR’]
变量并找出使用的IP地址。请记住它没有有效的过滤,任何人都能启动调试会话连接到服务器,即使他们的地址并不匹配 xdebug.remote_host.

xdebug.remote_cookie_expire_time

类型: integer, 默认值: 3600, 始于 Xdebug > 2.1

用于增减远端调试会话的cookie存在时间。

xdebug.remote_enable

类型: boolean, 默认值: 0

该开关控制Xdebug试图与调试客户端通讯,客户端通过设置 xdebug.remote_host 和 xdebug.remote_port侦听服务器和端口当。当设置为0,脚本仅仅是运行而连接不能被建立。

 

xdebug.remote_handler

类型: string, 默认: dbgp

可改为‘php3’使用旧的PHP3样式调试器输出,‘gdb’能使GDB生效类似于调试器接口,或是‘dbgp’使用调试器协议。DBGp协议是唯一支持的协议。

注意:2.1或以上版本只支持’dbgp’作为协议。

 

xdebug.remote_log

Type: string, Default value:

If set to a value, it is used as filename to a file to which all remote
debugger communications are logged. The file is always opened in
append-mode, and will therefore not be overwritten by default. There is
no concurrency protection available. The format of the file looks
something like:

Log opened at 2007-05-27 14:28:15

-> <init xmlns=”urn:debugger_protocol_v1″
xmlns:xdebug=” … ight></init>

 

<- step_into -i 1

-> <response xmlns=”urn:debugger_protocol_v1″
xmlns:xdebug=” … ></response>

 

xdebug.remote_mode

类型: string, 默认值: req

选择当调试连接的模式。有两种值:

req

当调试客户端一启动脚本运行,Xdebug尝试连接到调试客户端。

jit

只有在错误发生时,Xdebug才会连接到调试端。

 

xdebug.remote_port

类型: integer, 默认值: 9000

Xdebug试图连接到远端服务器的端口。端口9000是默认客户端与绑定的调试客户端关连端口。许多客户端都用此端口号,建议最好不要改。

到此所有配置已经完成。

实现原理

图片 15

DBGp是调试器后台和调试器界面通信的一种协议,用于多种脚本语言的调试。XDebug是用于调试PHP的DBGp实现。VIM要和XDebug互通,实现PHP的调试,需要能够理解DBGp协议,并能发送DBGp指令。DBGPavim就是这样一个插件,它使VIM能够接受DBGp请求,并发送DBGp指令,以达到调试目的。DBGPavim的名字源于DBGp@VIM。

ActiveState提供了用于调试Python/Ruby的DBGp实现Komodo Remote Debugging
Package,后面有一节将讲到如何使它和VIM互通,以调试Python。用户将能以此类推出如何调试ruby/nodejs等脚本语言。

  • Dev-PHP (IDE: Windows)
  • Eclipse plugin (IDE).
  • Emacs plugin (Editor
    Plugin).
  • KDevelop (IDE: Linux (KDE); Open
    Source).
  • ActiveState’s Komodo (IDE:
    Windows, Linux, Mac; Commercial).
  • MacGDBP (Standalone
    client for Mac OS X; Free)
  • NetBeans (IDE: Windows, Linux, Mac
    OS X and Solaris).
  • Notepad++ plugin (Editor:
    Windows).
  • WaterProof’s PHPEdit (IDE,
    from version 2.10: Windows; Commercial).
  • PHPEclipse (Editor Plugin).
  • Devsense’s PHP Tools for Visual
    Studio
     (MS Visual
    Studio Plugin; Commercial).
  • JetBrain’s PhpStorm (IDE;
    Commercial).
  • Protoeditor (Editor:
    Linux).
  • pugdebug (Standalone
    client for Linux, Windows and Mac OS      X; Open Source).
  • VIM plugin (Editor
    Plugin).
  • jcx      software’s VS.Php (MS Visual
    Studio Plugin; Commercial).
  • Xdebug Chrome
    App
     (Chrome
    Application; Open
    Source)
  • XDebugClient (Standalone
    client for Windows).

五、访问站点调试。

– libedit support: enabled

【已经有作者发过类似的文章了,流程不是太详细,这里做个补充吧,也是自己的备忘!】

在你运行脚本,你要让你的客户端能接收调试连接,请参考文章指明客户端需要如何配置的内容。使用捆绑的简单客户端请参考编译和安装一章。你可以用于支行“调试客户端”。

  1. Chrome 浏览器
  2. Xdebug (Chrome 插件)
  3. Postman (Chrome 插件)
  4. PHP 集成开发环境(如:phpStudy、wamp等)
  5. php_xdebug.dll 扩展
  6. PhpStorm IDE

Connect

  1. IDE Key 配置为 PhpStorm

    图片 16Xdebug
    插件配置

  2. Xdebug 插件开启调试

    图片 17Xdebug
    开启调试

如果xdebug.remote_connect_back利用了,其连接方式有些不同:

127.0.0.1 e.com

</init>

  1. 配置本地站点域名示例域名: e.com,绑定 host。

多用户调试

Xdebug只允许远程调试时指定的一个IP地址连接到 xdebug.remote_host。它不能在浏览器跑测试的时候连回到浏览器所在的机器IP,除非你使用xdebug.remote_connect_back。

如果开发者们的各种不同项目都放在同一(开发)服务器上,你可将每个项目通过Apache的.htaccess功能设置php_value xdebug.remote_host=10.0.0.5而使用xdebug.remote_host 设置。

这里有两种解决方法。第一,你可以使用DBGp代理。至于如何使用它参考 Debugging
with multiple
users
章节。你能在ActiveState’s web
site下载代理软件作为python远端调试包的一部分。有关更多文档位于 Komodo
FAQ。

第二是使用xdebug 2.1的xdebug.remote_connect_back设置。

三、Xdebug 浏览器插件配置

静态IP/单一开发

二、服务器配置

 

如上多个站点调试则新增配置即可。

Xdebug launcher for Opera

一、准备工具

3、       
要在浏览器运行PHP并激活调试器需安装以下浏览器插件。每种插件都能让你简单点下按钮就开启调试器。当这些插件激活,它们会直接设置XDEBUG_SESSION的cookie值,代替XDEBUG_SESSION_START。

[XDebug]zend_extension="D:\phpStudy\php70n\ext\php_xdebug.dll"xdebug.profiler_append = 0xdebug.profiler_enable = 1xdebug.profiler_enable_trigger = 0xdebug.profiler_output_dir ="D:\phpStudy\tmp\xdebug"xdebug.trace_output_dir ="D:\phpStudy\tmp\xdebug"xdebug.profiler_output_name = "cache.out.%t-%s"xdebug.remote_enable = 1xdebug.remote_handler = "dbgp"xdebug.remote_mode = "req"xdebug.remote_host = "127.0.0.1"xdebug.remote_port = 9010xdebug.idekey= PHPSTROM

The easiest Xdebug

Chrome插件只需一键帮助你打开或关闭调试。插件地址:.