php中dbgp,详解用DBGPavim在Vim中调试PHP/Python程序

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

实现原理

2eb398a194b46ea90b915cde15653111.png

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等脚本语言。

配置XDebug安装XDebug可以参考http://xdebug.org/docs/install。

编辑php.ini,加入以下两行:zend_extension=/path/to/xdebug.so

xdebug.remote_enable=1

编辑你的httpd.conf,加入以下行:php_value xdebug.remote_autostart 1注:这一行并非必须的,如果不加这一行,你需要在访问HTTP服务器的URL里加上XDEBUG_SESSION_START=1的参数,如: http://localhost/index.php?XDEBUG_SESSION_START=1。

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

注:这里的9009就是VIM作为DBGp服务器应当监听的端口,不同的开发人员在不同的VirtualHost中用各自不同的端口号。这个端口号和下一节提到的dbgPavimPort要一致。不加这一行,默认的端口号是9000。

最后可通过phpinfo.php检查你的XDebug配置是否正确,你必须能够看到以下这些行的值如下(主要是前两列):xdebug.remote_autostartOnOff

xdebug.remote_enableOnOn

xdebug.remote_handlerdbgpdbgp

xdebug.remote_host127.0.0.1127.0.0.1

xdebug.remote_port90099000

phpinfo.php文件内容如下:<?php

phpinfo();

?>

配置VIM + DBGPavim

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

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

export path=/path/to/python2.7/bin:$PATH

用以下命令编译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 Break At Entry,在入口处停下

bap Break only At breakPoints,只在断点处停下

调试器状态LISN调试器已启动,正处于监听状态。

PEND-n调试器已捕捉到连接请求,可以按F5进入调试模式了。

CONNVIM正处于调试模式中。

CLSD调试器已停止。

在Apache环境下调试PHP现在确认配置正确后,可以用VIM打开你需要调试的文件,跳到你需要调试的行,按F10设置当前行为断点,并按F5启动调试器。

用浏览器访问会调用相应PHP文件的URL,你会看到VIM状态栏里的的提示信息变成:bap-PEND-1它告诉你已经有一个连接被拦截,可以按F5开始调试了。

67e4dc66801861e899190ee50f37b772.png

按F5进入调试模式,你会看到VIM窗口被分成三部分:左上为源码窗口,右上为变量查看窗口,下方为调用堆栈窗口。

9f394f788a593c479848cad111902aee.png在源码窗口里,把光标定位到某一个变量上面按F12,在变量查看窗口就能看到该变量的值,如果该变量不是简单变量,其成员也会显示出来。如果该变量的某个成员仍不是简单变量,该行后面会出现一个加号,在该行按回车键,该成员的值将被继续展开。如果你想直接查看某个变量的成员变量,可以按v切换到visual模式,选中该成员再按F12,比如$this->login。在堆栈窗口,当你在某一行按回车,将跳到该层。最上面一行是最底层,最下面一行是最顶层。切换调用堆栈的层次,可以帮助你查看各个层次的变量,比如有些全局变量只有在最顶层才能看到。对于源码中没有出现的变量,你可以通过命令:Pg来查看,比如:g $this->memberShip你可以开始你的调试了,随时按F1可调出帮助窗口,再次F1就关闭帮助窗口。

d9561b78ba0a5221a968f6b48502fff7.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设置。

基本步骤如下:用VIM打开你需要调试的PHP文件,F10设置断点,F5启动调试监听。

从命令行运行php程序如上。

回到你的VIM窗口,将看到提示信息为PEND-1。

按F5进入调试模式。

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

调试Python程序

前面说过VIM + DBGPavim作为DBGp协议的服务器,可以与XDebug协同工作,也可以与ActiveState提供的Komodo Python Remote Debugging Client协同工作,实现Python程序的调试,具体步骤如下:从这里下载安装Komodo Python Remote Debugging Client,把解压后的bin目录加到你的PATH路径中,注意bin目录下的pydbgp文件。

用VIM打开你需要调试的Python文件,F10设置断点,F5启动调试监听。

通过pydbgp运行你的Python程序,如pydbgp -d 127.0.0.1:9009 test.py

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

2e7d9f4471600c3c188a65c03561fec5.png

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

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

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

VIM + DBGPavim也是支持远程调试的,但同样避免不了路径映射的设置,如下:let g:dbgPavimPathMap = [['D:/works/php','/var/www'],]注:这里的9009端口就相当于上面为PHP调试时设置的xdebug.remote_port,需要和dbgPavimPort保持一致。

回到你的VIM窗口,将看到提示信息为PEND-1。

按F5进入调试模式。

DBGPavim相对于其他插件的优势

DBGPavim源于VIM早期的一个DBGp插件http://www.vim.org/scripts/script.php?script_id=1152,从这个插件还衍生出其他一些DBGp插件。但DBGPavim重写了作为调试器后台的DBGp服务器,异步监听,使得VIM在监听DBGp的同时不妨碍用户与VIM之间的交互。用户按F5启动调试监听后,可继续使用VIM,随时可按F6停止监听。

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

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

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 = ''

let g:dbgPavimKeyStepOver = ''

let g:dbgPavimKeyStepInto = ''

let g:dbgPavimKeyStepOut = ''

let g:dbgPavimKeyPropertyGet = ''

let g:dbgPavimKeyContextGet = ''

let g:dbgPavimKeyToggleBp = ''

let g:dbgPavimKeyToggleBae = ''

let g:dbgPavimKeyRelayout = ''

VIM命令,所有命令只有第一个字母为大写。:Bl列出所有断点

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

1. 检查命令行下XDebug/pydbgp的设置是否正确

2. 启动调试器监听

3. 用php/pydbgp执行当前文件 g 查看较长变量的值,比如:Pg $this->savings[3]

:Up调用堆栈往上一级 n调用堆栈往下一级

:Wc [$foo]打开/关闭对变量$foo的监视。如果没有参数,就监视当前执行环境下的所有变量。

:We 打开/关闭对语句foo的监视,即每一单步后自动执行foo语句。

:Wl列出所有被监视的变量或语句。

:Children 对于数组默认显示前1024个元素,这个命令可以修改。 epth 对于复杂变量,默认只显示下一层成员,这个命令可以设置限制多层。

:Length 对于字符串变量,默认执行显示前1024个字符,这个命令可以设置显示长度。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Windows 下使用 Notepad++ 和 xdebug 调试 php 脚本 转自:http://www.mikespook.com/index.php/archives/98 介绍Notepad++ 是开放源代码的可替代记事本的编辑器。它运行于 MS Windows 环境,支持多种编程语言。可以浏览http://notepad-plus.sourceforge.net/ 了解更多相关信息。 Xdebug 是 php 的一个扩展,它提供了对 php 脚本进行除错、追踪、检查的各种功能。可以浏览 http://xdebug.org 了解更多相关信息。 下载Notepad++ 下载地址:http://www.baidu.com/link?url=uULkAaYHzZDZSGm8XOlPH8EPhKZCv8mcbQtmU82LssIoYsVDW2MdIi6g1hdcDKjpGacAHz0xtnxWZHuD1HWUEoL9qCFlDPS1jxAqOJ1ZrYe&wd;=&eqid=8c17eb080003c9bf000000035a1919ed Notepad++ 插件 DBGP plugin: http://download.csdn.net/download/hongjia88/10132543 xdebug:https://xdebug.org/download.php * xdebug 的版本需要匹配环境使用的 PHP 版本。 xdebug helper for firefox:https://addons.mozilla.org/zh-CN/firefox/addon/3960 安装Notepad++ 的安装方式如同大多数 Windows 下软件一样是非常简单的。只需按照屏幕提示设置并点击“下一步”,最后“完成”即可安装成功。 为了让 Notepad++ 和 xdebug 协同工作,需要安装 DBGP plugin。下载后只需解压缩至 Notepad++ 安装目录的 plugins 目录即可,如:C:\Program Files\Notepad++\plugins。 xdebug 的安装请参考:http://www.mikespook.com/index.php/archives/34。需要说明的是,如果同时安装有 xcache 一定要先加载 xcache,再加载 xdebug。否则会造成 php 运行异常。 使用首先,将编写分别使用递归方式和使用循环方式计算100的阶乘的两个函数,如下: <?php function f1($x) // 循环计算 $x 的阶乘 { for($i = $x - 1; $i > 1; $i–) { $x *= $i; } return $x; } function f2($x) // 递归计算 $x 的阶乘 { if($x == 1) { return $x; } else { $y = $x - 1; return $x * f2($y); } } echo ‘f1: ‘ . f1(10); echo ‘’; echo ‘f2: ‘ . f2(10); 将该文件放入可通过 web 访问并由 php 正确解析的目录,访问结果如图: 使用 Notepad++ 打开这个文件。通常在文件上点击鼠标右键(或者左键,如果你跟我一个方向的话),选择“Edit with Notepad++”,如图: 如果你没有这项,或者无法使用 Notepad++,请检查是否正确的安装了 Notepad++。打开后的界面如图: 在 Notepad++ 的菜单“插件”选择“DBGp”并点击“Debug”: 会在编辑器下半部分打开调试窗口: 此时就已经打开了编辑器端的调试功能。 现在需要配置notepad++,打开DBGp->Debugger->config,填写Remote Server ip为127.0.0.1,IDE Hey留空,Remote Path和Local Path都为存放你的php文件的路径,点击确定,OK。 注意C:\windows\php.ini“xdebug.remote_port=9000”。 使用XDEBUG_SESSION_START=1参数访问刚才编写的文件,如:http://127.0.0.1/foobar.php?XDEBUG_SESSION_START=1 此时会发现 Notepad++ 窗口会闪烁一下,这说明 Notepad++ 的 DBGp 插件已经生效。将光标放置到需要设置断点的位置,并点击有红点的按钮,光标所在行前会显示一个红点,表示断点行,如图: 此时访问/foobar.php?XDEBUG_SESSION_STAR

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值