Sunday, 8 October 2006

PHP Remote Debugging - DBG

PHP Remote Debugging,是对PHP Web应用程序进行调试的最直接、最有力的手段。尤其是现在,框架横行的时代,光靠阅读源码和简单的echo,显然进展不快。

Remote Debugging,直译过来是“远程调试”,个人更愿意翻译成“在线调试”,即在实际使用Web Server的情况下,对Web Application进行调试。

诸多PHP IDE,都集成了广泛使用的DBG调试模块。这里以PHPEdit为例,介绍如何使用DBG进行PHP程序的在线调试。PHPEdit包含了DBG Listener和DBG Debugger,能够进行单步跟踪、全局和局部变量检查等功能,用它进行Remote Debugging,非常方便、实用。

在启动PHPEdit的时候,DBG Listener也会一同启动。在系统托盘区,可以找到一个类似雷达天线的图标,那个就是PHP DBG Listener。DBG Listener的基本设置,

Bind address:  0.0.0.0
Port: 7869
IDE COM class: PHPEdit IDE
X Breakpoint on script start
X Breakpoint on script finish

最后这两行设置,会在PHP脚本的开始和结束的地方,自动设置断点。这样就不必手工去设置断点了。当你不清楚程序的整体结构和入口点的时候,这就显得很方便。DBG Listener通常是处于等待(Waiting)的状态。

设置PHPEdit,以便进行在线调试。在PHPEdit Perferences中,选择Debugger。

X HTTP (SAPI or remote CGI)
X Use backslashed in filenames on remote filesystem (win32)
X Make file name low case before mapping

后续的Mapping部分,是将实际要访问的HTTP URL和本机的文件目录对应起来。如果Web Server和PHPEdit在同一台机器上,就没有必要在本机再建立一个工作备份,Mapping可不设。

设置完成之后,点击Debug - Start Listener,以准备接受Remote Debugging指令。一旦PHPEdit和DBG Listener配置好之后,就不需要每次都去Start Listener,PHPEdit会自动开始对Remote Debugging的监听。

Web Server这一端,需要修改php.ini以提供对DBG的支持。在php.ini的Dynamic Extensions段,增加

extension=php_dbg.dll

[Debugger]
debugger.enabled=on
debugger.profiler_enabled=on
debugger.JIT_enabled=on
debugger.JIT_port=7869

DBG的扩展模块,可以从这里下载。选择合适的版本,放到php的扩展目录下,并改名为php_dbg.dll。对于版本号高于5.1.2的PHP,用for 5.1.2的那个dll即可。

通过查看phpinfo()的输出信息,确认PHP DBG模块被正确安装。

This program makes use of the Zend Scripting Language Engine:
Zend Engine v2.1.0, Copyright (c) 1998-2006 Zend Technologies
with DBG v2.15.1, (C) 2000,2006, by Dmitri Dmitrienko
...
dbg
DBG php debugger, version 2.15.1, Copyright 2001, 2006, Dmitri
Dmitrienko, www.nusphere.com

Version 2.15.1
Linked as a shared library.
Profiler compiled, enabled

Directive Local Value Master Value
debugger.enable_session_cookie On On
debugger.enabled On On
debugger.fail_silently On On
debugger.ignore_nops Off Off
debugger.JIT_enabled On On
debugger.JIT_host clienthost clienthost
debugger.JIT_level 3 3
debugger.JIT_port 7869 7869
debugger.profiler_enabled On On
debugger.session_nocache On On
debugger.timeout_seconds 300 300

现在一切准备就绪,可以开始PHP Remote Debugging了。DBG Remote Debugging不会自动开启,需要激活一下。在浏览器中,输入

http://localhost/myscript.php?DBGSESSID=1@localhost:7869

就会切换到PHPEdit,打开myscript.php,光标会自动停在myscript.php中PHP程序部分的开始。接下来,就是标准的debug操作,跟踪、步进、变量察看等等。随着PHP代码的运行结束,最后输出的Web Page就会出现在浏览器中。这样就完成了一个DBG的调试周期。

一旦开启DBG在线调试,之后就不再需要附加Active Command了。以后对每个PHP页的访问,都会自动进入调试状态。

使用下面的命令,中止DBG Remote Debugging,取消调试。

http://localhost/myscript.php?DBGSESSID=0

DBG Listener可以支持多个IDE,如果安装有多个支持DBG的IDE,需要注意实际使用哪个IDE进行调试。

如果在未开启DBG Listener或相应的IDE的情况下,使用Active Command,或者在Remote Debugging过程中,IDE退出,浏览器上都会得到出错信息。此时,需要附加取消调试的指令,才能恢复对PHP页面的正常访问。

3 Comments:

At 12 December, 2006 23:45, Anonymous Anonymous said...

dbg模块的免费版似乎只支持到php5.1.2呀,之后的怎么办呢?
另外,我的phpedit每次都提示说“file ****.php not found”,怎么办啊……
搜来搜去,只搜到你的文字写的比较详细,希望能帮帮忙~
mail: georgexsh at gmail.com

 
At 13 December, 2006 12:21, Blogger OneZ said...

dbg for PHP 5.1.2的那个模块,是可以在PHP 5.1.x系列后续版本中使用的。文中实际使用的是PHP 5.1.6。

该模块对PHP 5.2不支持,只有等待新版本出现。

 
At 23 February, 2007 00:06, Anonymous Anonymous said...

onez,谢谢你的回复
dbg模块可以支持是没错,但是我在phpedit跟eclipse下面debug的时候都巨慢无比,只好放弃……
试用了xdebug模块似乎好一些

 

Post a Comment

<< Home