作者:肾虚养生 | 来源:互联网 | 2017-05-14 02:44
本文主要介绍如何在服务器上用VIM+XDebug调试PHP程序,目前虽然有不少介绍如何用Eclipse+XDebug在开发人员工作机上调试PHP的文章,但对于如何系统的配置VIM+XDebug还是比较少的,而且目前关于VIM设置的文章都用一个比较老的插件。这里主要介绍一个新插件DBGPavim,它相对于老的一些插件有很多优势。同时该插件可完美的用于Python程序的调试。另外VIM+XDebug相对于Eclipse+..
本文主要介绍如何在服务器上用VIM + X#code/8684.html" target="_blank">Debug调试PHP程序,目前虽然有不少介绍如何用Eclipse + XDebug在开发人员工作机上调试PHP的文章,但对于如何系统的配置VIM + XDebug还是比较少的,而且目前关于VIM设置的文章都用一个比较老的插件。这里主要介绍一个新插件DBGPavim,它相对于老的一些插件有很多优势。同时该插件可完美的用于Python程序的调试。另外VIM + XDebug相对于Eclipse + XDebug也有不少优势,将在文章讲述。
实现原理
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_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文件内容如下:
配置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进入调试模式了。
CONN VIM正处于调试模式中。
CLSD 调试器已停止。
在Apache环境下调试PHP
现在确认配置正确后,可以用VIM打开你需要调试的文件,跳到你需要调试的行,按F10设置当前行为断点,并按F5启动调试器。
用浏览器访问会调用相应PHP文件的URL,你会看到VIM状态栏里的的提示信息变成:
bap-PEND-1
它告诉你已经有一个连接被拦截,可以按F5开始调试了。
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个字符,这个命令可以设置显示长度。
以上就是详解用DBGPavim在Vim中调试PHP/Python程序的详细内容,更多请关注 第一PHP社区 其它相关文章!