<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES--> 根据一个广为流传的传说,第一个计算机 bug 是一只真正的虫子,它出现在 Harvard University 测试的 Mark II Aiken Relay Calculator 中的一个继电器上。根据操作员在 1947 年 9 月 9 日所做的日志记录,这只虫子是 “(在计算机中)发现的第一个 bug”。在图 1 中可以看到这份手写的日志记录和这只声名狼籍的虫子。
图 1. 声名狼籍的 Mark II 虫子
实际上,bug 这个词的起源要早得多,可能比前面这次事件早了大约七十年。在 1848 年,Thomas Edison 在描述机械故障时写道,“首先是觉得有点儿不对劲儿,然后是一声爆响,接着麻烦就来了 —— 机器不正常了,出现了小故障和各种麻烦等 ‘bug’...” 显然,与 Edison 同时代的人已经把 bug 这个词当作行话了。
了解到即使是 Edison 也必须对其发明进行 “调试(debug)”,软件开发人员可能会觉得有所慰藉并受到鼓舞(Edison 没有用过 debug 这个词。这个词比较新,它是在二战时期从航空工业开始成为工程师的行话的)。或者,您可能希望所有的 bug 都是真正的虫子,那倒好办了,我们只需安装一个捕虫器就行了。“计算机 bug 进得来,但是出不去。”(有人能在 Subversion 的下一版中增加这个特性吗?)
但是,正如 Edison 所指出的,bug 是每个工程项目的固有部分。在讨论发明时,Edison 写道,“必须经过数月的艰苦观察、研究和劳动,才能让产品经受市场的考验。”
幸运的是,软件开发人员可以利用工具简化 “观察” 的过程,将花费的时间从几个月减少到几分钟,至少减少到几小时或几天。以前的一篇文章 “Squash bugs in PHP applications with Xdebug” 介绍了收集分析故障原因所需的信息的各种技术。但是,这种故障后分析往往很困难,而且很耗费时间,因为必须做出推测,然后进行测试。如果缺少关键的信息,那么必须反复研究、调整和测试代码,这个过程可能要重复许多次。
本文讨论一种更高效的调试技术:交互式调试(interactive debug)。有一种称为调试器(debugger) 的特殊应用程序,它们可以探测正在运行的代码,允许在任意的断点暂停执行,检查对象、检查调用堆栈和环境,甚至允许在运行时修改变量的值。
在本文中,将使用 Zend Debugger;它是 Zend 引擎的一个扩展,可以探察正在运行的 PHP 应用程序。可以免费下载并使用 Zend Debugger。但是,为了控制 Zend Debugger 和查看它的诊断信息,需要同时使用一个客户机应用程序。客户机可以是从命令行运行的简单程序,也可以是成熟的集成开发环境(IDE),提供编辑器、代码补全、图形化类浏览器等特性。
有好几种开放源码客户机可以与 Zend Debugger 进行交互,包括开放源码的 PHP Eclipse 插件。但是,我喜欢的 PHP IDE 是由 Zend Technologies 提供的 Zend Studio,这家公司同时提供 PHP 运行时引擎的开放源码版本和商业版本。与 PHP 本身不同,Zend Studio 是一个商业产品。可以下载这个软件并免费使用 30 天,这段时间足够您体会它的众多特性了;但是在此之后,如果希望继续使用它,就必须购买许可证。对于我来说,许可证的费用绝对物有所值。
您应该试试各种客户机,寻找适合自己的软件。例如,许多 IDE 包含您喜欢的编辑器,这样就不需要重新学习一套键盘快捷键。无论选择哪种软件,当您开始使用调试器客户机之后,很可能会发现再也离不开它了。您可以和 print_r() 说再见了!
安装 Zend Studio 和 Zend Debugger
首先,下载并安装 Zend Studio 和 Zend Debugger 软件。这里的步骤说明针对 Mac OS X,但是在 Linux® 和 Microsoft® Windows® 操作系统上安装步骤是相似的。(Zend Studio Web 页面为每种平台提供了安装说明。)实际上,可以在本地系统上安装并运行 Zend Studio,将调试器部署在服务器上,这样就可以进行远程代码调试。
无论使用哪种平台,都要确保系统中运行着 PHP V4 或 PHP V5:Zend 软件可以与这两个版本的 PHP 配合工作。因为 Mac OS X 当前附带 PHP V4(更精确地说,是 V4.4.7),所以本文基于这个比较老的 PHP 版本。
安装 Zend 工具的步骤如下:
访问 Zend Downloads 并单击 Try for Zend Studio。
创建一个登录,然后下载 Zend Studio Client V5.5.0a(这是编写本文时的最新版本)和 Zend Debugger V5.2.6。
下载完成时,运行 Zend Studio 安装程序。安装程序运行结束之后,系统中应该有一个名为 /Applications/Zend Studio 5.5.0/ 的目录。
打开这个文件夹,再打开 bin 子文件夹,然后双击应用程序 ZDE。应该会出现与图 2 相似的空 IDE。
图 2. Zend Studio IDE
稍后再设置这个 IDE 来安装调试器。
下载 Zend Debugger 软件并用 tar xzvf ZendDebugger-5.2.6-darwin8.6-uni.tar.gz 命令进行解压,创建 ZendDebugger-5.2.6-darwin8.6-uni 目录。
进入这个新目录并将文件 4_4_x_comp/ZendDebugger.so 复制到另一个便于寻找的目录,以防止意外删除这个文件。如果在您的 Mac 机上已经安装了 Xcode 开发工具,那么 /Developer/Extras/PHP 是放置这个文件的合适位置:
对于本文,所有 PHP 应用程序都创建在您的主文件夹的个人 Web 站点目录中。所以指定 localhost/~username/ 作为 Debug Server URL(这可以是服务器上包含 PHP 文件的任何路径。使用这个设置和 Dummy File 设置在 Zend 引擎中启用调试)。我的 Mac OS X 用户名是 mstreicher,所以我指定 localhost/~mstreicher/,见 图 5。
调试器使用 Client IP 连接那个运行 Zend Studio 的系统。这个设置通常可以是 Default,但是因为客户机和服务器都在本地运行,所以选择 Customized 并提供 localhost 作为 IP 地址。
<?php
class Pizza {
var $size;
var $toppings = array();
var $price;
function Pizza( $size = "R", $toppings = null ) {
$this->size = $size;
$this->toppings = $toppings;
}
function size() {
return( $this->size );
}
function price() {
$this->price = 10;
$multiplier = 1;
switch ( $this->size ) {
case 'L':
$multiplier = 1.25;
break;
case 'XL':
$multiplier = 2;
break;
}
$this->price = $this->price +
( sizeof( $this->toppings() ) ) * $multipler;
return( $this->price );
}
function toppings() {
return( $this->toppings );
}
function add( $topping ) {
$this->toppings[] = $topping;
}
}
?>
按照以下步骤创建项目:
打开 Zend Studio 并选择 Project > New Project 来创建一个新项目。
将这个项目命名为 pizza(见图 8),然后单击 Next。
图 8. 创建新项目,pizza
在出现的窗口中,可以将一个或多个源代码目录添加到项目中,从而便于在 IDE 中寻找、打开、编辑和保存项目的所有代码。因为这是一个新项目,所以只添加一个新的源代码目录。
单击 Add path,找到您的个人站点目录,然后单击 New Folder(右上角第三个按钮)。
输入名称 pizza,单击这个条目(见图 9),然后单击 Add。
图 9. 创建新的源代码文件夹
向导窗口现在像图 10 这样。
图 10. 项目现在有一个源代码文件夹
单击 Next。 下一组设置指定如何连接 Web(调试)服务器。
取消 Use System Defaults 复选框并输入应用程序的 URL,比如 localhost/~username/pizza/index.php(如果使用 Mac OS X)或 localhost/pizza/index.php(如果使用 Linux® 机器作为服务器,使用 Mac OS X 运行 Zend Studio),见图 11。