Monday, 30 October 2006

Upgraded

Ubuntu 6.10已发布了,周末升级了一下,感觉还不错。

NetBeans 5.5也已发布,增加了对C/C++、Web Application,以及企业应用的支持,这个版本对Subversion也提供了很好的支持,使用的第一印象很好。和Eclipse相比,除了对Script语言的支持比较差之外,对使用Java,C/C++等语言的开发,NetBeans更加好用。

另外NetBeans还有免费Free CD派送,且有简体中文版。

Wednesday, 25 October 2006

Trac 0.10-stable Released

Trac 0.10稳定版本(Zengia)发布。和以前的版本相比,主要的变化是:

  • Support for spam protection.
  • Advanced diff support.
  • InterWiki and InterTrac support.
  • Improved notification system.
  • WSGI Used as web server protocol.

详细的情况,请参见ChangeLogRelease Notes

以前的Post中提到过,Windows平台中使用Trac,需要修改三个文件的文件名。0.10b版本中出现的tracdb2env,现在没有了。因此,只要改tracd和trac-admin这两个文件即可。

Monday, 9 October 2006

Python Remote Debugging in Komodo

上一篇中提到,Xdebug的DBGp协议,也可以用来对非PHP程序进行在线调试。刚好,拿它来试验一下如何对Python程序进行Remote Debugging。

Komodo中的设置,和前面是一样的,设置Preferences - Debugger - Proxy中的,

Listen for debug connections on port: 9000

再选择Debug - Listen for Remote Debugger即可。

接下来要安装DBGp调试模块。在系统的PATH中增加

<komodo-install-directory>\lib\support\dbgp\bin

再增加一个系统环境变量

PYTHONPATH=%PYTHONPATH%;<komodo-install-directory>\lib\support\dbgp
\pythonlib

用实际路径替换上面的<komodo-install-directory>。

在Command Prompt下,测试模块是否安装正常。

python -c "import dbgp.client; print 'ok'"

如果看到ok,那就没有问题,接着就可以开始实际调试。

先拿最简单的abc.py作试验,

from math import sqrt
a = 3
b = 4
c = sqrt( a * a + b * b )
print a, b, c

在命令行中输入,

pydbgp -d localhost:9000 abc.py

切换到Komodo中可以看到,光标停在了第一行,调试已经开始。step in...

这种调试方式,似乎用处不大。普通的程序,在Komodo里面直接调试可能更好。而对于像Pylons这种Web应用程序来讲,还是不能进入Remote Debugging。为了解决这类问题,就需要使用Komodo的DBGp模块所提供的Hard-Code Break方式,来进入调试状态。

在需要进行Debug的py程序中,插入如下代码,

from dbgp.client import brk

...
class HelloController(BaseController):

def index(self):
...

def breakhere(self):
...
brk(host="127.0.0.1", port=9000)
...
return render_response('/myview.myt')

这里,导入Remote Debugging的客户端模块,brk()设置一个Hard-Code Break,调试器指向127.0.0.1:9000。

继续像过去一样,通过Paster来运行Pylons应用程序。现在,访问http://localhost/hello/breakhere。切换到Komodo,这时光标就会停在brk()后面。接下来的故事,就不必说了。

初步试验下来的感觉,Komodo尽管还不是非常完善,但已经能够实现了对Python程序的Remote Debugging,这对研究Python Web Framework会有所帮助。

Sunday, 8 October 2006

PHP Remote Debugging - more details

PHP Remote Debugging,相应的配置要涉及到Web Server端和IDE端,以及实际页面的访问。一开始的时候,有些摸不着头脑,理清楚了,就比较简单。

了解PHP的调试,一定会走到PHP在线帮助的“Appendix E. Debugging PHP”。在这一页的最后,又见到了熟悉的老朋友,一段Python代码,一个简单的在线调试监听器。运行这段Python code之后,在浏览器上输入在线调试指令,真的就连接过来了,从而知道PHP Remote Debugging是如何开始的。

无论DBG还是Xdebug,都在调试开始指令中,包含了所调试PHP脚本的完整的路径名和文件名。这样,IDE就可以直接打开相应的文件进行调试,在本机直接跳过HTTP URL到FS File这样的映射(Mapping)。

所使用的PHP解释器,是Web Server上的那个Parser,而不是IDE附带或连接的PHP。在Remote Debugging的过程中,IDE使用的PHP根本就没有用上。所以,IDE的PHP不必和Web Server的保持一致,甚至可以不设置。

DBG模块,可以对多个Port提供调试支持。PHPeclipse中的调试端口不固定,要写成debugger.JIT_port=7869, 10000/16这个样子。

Remote Debugging的过程,从Client/Server的角度来看,IDE充当了Server,在指定端口上监听调试连接。PHP的DBG和Xdebug扩展模块,则是Client。调试从浏览器的开始指令发起,PHP的调试器从Web Server那里得到调试指令,就去和对应端口的Server,即IDE联系,从而开始一个Remote Debugging的对话。

前面的Post中,提到Xdebug所使用的DBGp,是一个基于XML的多语言调试协议。在DBGp的开始指令中,还包含了脚本语言项。因此,Xdebug is not for PHP only, but also Python, Ruby...。如果在项目中,要在PHP、Python和Ruby之间跨越,使用Xdebug作为Remote Debugging的手段,无疑是非常合适的。这应该就是为什么Komodo选择Xdebug的原因吧。

PHP Remote Debugging - DBG + Xdebug

在前面两篇中,分别提到了如何用DBGXdebug扩展模块,在IDE中进行PHP Remote Debugging。

谈到IDE,PHPeclipse也是一个目前比较流行的PHP开发环境。其正式的版本中,使用DBG作为调试器。目前在其开发版本中,包含了对Xdebug的支持。PHPeclipse在使用DBG的时候,不需要DBG Listener,其内置了监听器,缺省所使用得端口也有所改变。

对php.ini进行设置,以实现同时对DBG和Xdebug模块,以及多个PHP IDE的支持。具体的设置如下:

...
extension=php_dbg.dll

[Debugger]
debugger.enabled=on
debugger.profiler_enabled=on
debugger.JIT_enabled=on
debugger.JIT_port=7869, 10000/16
...
zend_extension_ts="ext/php_xdebug.dll"
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.show_exception_trace=on
xdebug.show_local_vars=on
xdebug.show_mem_delta=on
xdebug.idekey=<idekey>

在使用调试器的时候,不要启用Zend Optimizer。Xdebug必须占用zend_extension_ts,才能进行Remote Debugging。

这里,Xdebug的loading,使用了相对路径,也可以使用绝对路径,以适应PHP扩展模块目录的位置变化。

PHP Remote Debugging - Xdebug

PHP Remote Debugging,另一个比较流行的调试模块是Xdebug。Xdebug,使用上非常方便,在遇到exception的时候,能够将Application当前的状况,变量、call trace等信息,友好地直接输出到web页面上。

Xdebug上下载Xdebug for PHP的扩展模块,将其置于PHP的ext目录中。在php.ini中增加,

extension=php_xdebug.dll

xdebug.show_exception_trace=on
xdebug.show_local_vars=on

这样就可以在Web Application遇到语法或值溢出等exception的时候,显示相关变量和调用堆栈。

对于PHP Remote Debugging,需要在php.ini中对Xdebug进行更多的设置。

zend_extension_ts="ext/php_xdebug.dll"
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.idekey=<idekey>
xdebug.show_exception_trace=on
xdebug.show_local_vars=on
xdebug.show_mem_delta=on

并将和Zend Optimizer有关的选项全部关闭。在phpinfo()中,检查是否成功启动Xdebug。

Xdebug支持多个调试协议,GDBDBGp和PHP3。这里使用的是DBGp,一个基于XML的多语言调试协议。

目前,Xdebug的最新版本是2.0.0 Beta。和DBG Debugger相比,支持Xdebug的IDE还不太多。这里以Komodo为例,说明基于Xdebug扩展,如何进行Remote Debugging。

安装好Komodo 3.5.3之后,设置Preferences - Debugger - Proxy中的,

Listen for debug connections on port: 9000

再选择Debug - Listen for Remote Debugger。如果出现勾号,没有出错信息的话,Komodo is ready for remote debugging。

输入Xdebug调试开始指令,

http://localhost/myscript.php?XDEBUG_SESSION_START=1

切换到Komodo,对PHP程序进行在线调试。

上述指令,会启动一个持续的Xdebug调试session,后续PHP脚本会自动进入在线调试状态。也可以只对单个PHP脚本进行单次Remote Debugging。

http://localhost/myscript.php?XDEBUG_SESSION_START

这样就不需要再输入调试中止指令,直接退出Remote Debugging。调试中止指令,格式如下,

http://localhost/myscript.php?XDEBUG_SESSION_STOP

需要指出的是,XDEBUG_SESSION_STOP不会立即停止对当前PHP的在线调试,而是停止对此以后的PHP的Remote Debugging。

Xdebug提供了一个xdebug_break()函数,直接在程序中设置断点,而不是在Komodo中设置。

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页面的正常访问。