如何用 Eclipse 调试 Perl 应用程序
2010年09月29日
本教程将介绍 Eclipse 的 EPIC 插件提供的调试功能,该插件提供了功能丰富的调试环境 -- 可为 EPIC Perl 开发环境所用且与此开发环境相集成。本教程假设读者了解 Eclipse 环境,并且有使用 Perl 的经验。
关于本教程
EPIC 结合了两种有助于 Perl 应用程序测试流程的系统:RegExp 和调试器。RegExp 是一个测试 Perl 正则表达式的接口。正则表达式是许多 Perl 应用程序的主要组成部分,但保证表达式的正确性是一个非常复杂的问题。使用 EPIC RegExp 视图,您可以根据已知数据检查结果,测试并修改正则表达式。
EPIC Perl 调试器是一种较为传统的工具,完全集成于 Eclipse 环境之中。除测试本地化脚本外,EPIC 调试器还可用于调试 Web 及远程执行 Perl 脚本,因此是多种环境下的理想工具。
本教程将介绍如何导入和移动大型应用程序、如何简化应用程序视图以使代码更易于理解,从而也更易于调试。另外还会介绍 EPIC 调试环境,它完全位于 Eclipse 内部,为标准脚本、CGI 脚本和正则表达式提供了一个完整的调试环境。
前提条件
要开始使用 EPIC,需要满足以下前提条件:
Eclipse V3.1 或 3.0
Java?? 技术 V1.3、1.4 或更高版本
Perl V5.8.6 或更高版本。绝大多数 UNIX??、Linux?? 安装及 Mac OS X 中都包含 Perl。Windows?? 上使用 ActivePerl。
Eclipse 的 EPIC 插件
PadWalker Perl 模块。ActiveState 版本 也可。
传统 Perl 调试技术
在介绍 EPIC 之前,让我们首先来看看 Perl 所使用的传统调试技术,这些技术随时可用,并且确实有一些优点。但它们也有着自身的局限性。理解其局限性有助于您理解为何需要一种更好的调试环境。
Perl 中的调试简介
如果您问一位典型的 Perl 程序员怎样调试其应用程序,他多半会告诉您他只是使用简单的输出语句,在程序执行时转储信息。例如,您可向循环中添加一条简单的语句,来输出您正在计算或处理的值,如清单 1 所示。 清单 1. 使用输出语句进行调试
my $sth = $dbh->prepare($query);
$sth->execute();
while(my $row = $sth->fetchrow_hashref())
{
print STDERR Dumper($row);
printf('%s, %s (%s)',
$row->{album},
$row->{artist},
$row->{genre});
}
$sth->finish(); 在这种情况下,您已输出了从数据库 (MySQL) 载入到 STDERR 的行转储。STDERR 使用起来非常方便,这是因为在 UNIX 主机上,您可将 STDERR 的输出重定位到日志文件,同时使其他输出照常定位到标准输出。
示例中的 Dumper() 函数会实际输出任何变量的结构,包括嵌入式和嵌套的数组、散列及其他内容。输出格式与您手动生成的结构形式相同。此函数(Data::Dumper 模块的一部分)非常有用,既可作为以适于人类阅读的格式输出变量的方法,也可用于写入一个能读回的结构,使用 eval() 可重新创建一个新变量。
事后调试
在应用程序运行时,利用输出信息的输出函数这种方式正是事后调试的一个例子。此时您并未实际监控应用程序的执行,也没有尝试找出应用程序运行过程中的问题,而是将信息转储出来,并等待执行完成。
在交互式调试难以实现的情况下,这一特殊的调试方法广受人们的欢迎。例如,实时调试 CGI 应用程序基本上是不可能实现的,因为应用程序在远程服务器上执行,且由第二应用程序(Web 服务器)执行。不可能实时监控脚本执行。
因此,事后调试有其用武之地,但也有一些显而易见的局限性。举例来说,在不更改代码的情况下,您无法监控任何变量,而一旦更改了代码,您就必须再次运行程序,以获得期望的输出。
同样,您无法逐行单步调试程序的执行。必须运行整个应用程序,除非您强行停止它。如果要跟踪函数调用和序列,就需要添加输出语句,以显示作出的是怎样的决策,并显示顺序与序列,除此之外,别无他法可监控或获得信息。
实时调试
有多种实时调试系统(Perl 自带的调试器就是其中之一),您可从使用 -d 命令行选项入手(参见清单 2)。该命令行选项会启动一个交互式会话,通过此会话即可逐行单步调试、跳过代码段、监控变量和值,甚至在执行过程中修改值。 清单 2. 使用 Perl 调试器
$ perl -d -e 0
Loading DB routines from perl5db.pl version 1.28
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(-e:1): 0 本例中的文本界面很清晰,但依然难以理解发生了什么事、显示了什么信息、当前在代码特定部分中的哪处执行。 有一些 GUI 可供 Perl 调试器使用,但通过这些界面能实现的功能依然有限。最重要的是,通过这样的界面调试 Web 应用程序非常困难。
无论在哪种情况下,上述调试系统的主要局限性均在于:它们都是您必须添加到编程工具箱中的其他工具。但任何一种都未为您的开发环境提供集成化的解决方案。
这正是 Eclipse/EPIC Perl 调试器发挥巨大优势的场合。它内置于 Eclipse 系统之中,因此,允许您在同一应用程序内同时实现开发、编辑和调试。
在 EPIC 中导入和处理现有项目
上面已经介绍了传统的 Perl 调试技术,现在是 EPIC 登场的时候了,下面将介绍在项目中遍历的方法 -- 对于代码执行和调试来说,这是一项至关重要的技巧。要研究实现此目标的最佳方法,需要以一个大型项目作为示例。为使项目进入 Eclipse,您将使用导入系统将文件添加到新项目中。
运行导入
要了解如何调试应用程序,一个好方法就是首先将已开发出的应用程序导入您的系统中。这将为您奠定良好的基础,并使您有机会了解如何在大型项目中遍历 -- 在使用调试器接口时,这是一项必备的技巧。
按以下步骤操作即可导入一组现有文件:
若必要,创建一个新项目(若想将文件添加到您自己的项目中,也可使用现有项目)。
在 File 菜单中选择 Import。
从可用导入源清单中选择 File system,参见图 1。
图 1. 选择导入源
单击 Next。
在下一面板中单击 Browse,选择导入操作的源文件夹。文件夹将显示在左侧的面板中。源文件夹中的其他文件夹则以树型结构显示在此列表中。选中文件夹中的文件则显示在右侧的面板中。
单击所显示文件夹旁边的复选框。也可按照同样的机制选择多个独立文件和文件夹。
您可选择至此完成,但有时,您可能不想导入此文件夹中的其他文件。手动选择文件非常复杂,您可利用过滤器自动选择文件导入:
若想仅选择 Perl 文件(通常是以 .pl -- 即脚本、.pm -- 即模块结尾的那些文件),请单击 Filter Types 按钮。
您将看到一个可能文件类型的清单提示(参见图 2)。所有的 Perl 文件类型旁都带有骆驼图标。单击您希望导入的文件类型旁的复选框。
图 2. 选择要导入的文件类型
如果您为 Perl 文件使用了非标准扩展名,可通过 Other Extensions 文本框添加您的扩展名。
确定最终的扩展名清单后,单击 OK。
最好检查一下已选择了哪个文件。从源文件夹中选择的各文件旁应已有复选框。在图 3 中可看到过滤后文件的示例。
图 3. 查看要导入的文件/文件夹
查看原图(大图)
如果确认已选好的导入文件/文件夹无误,即可单击 Into Folder 文本框旁的 Browse 按钮。系统将要求您选择导入文件的目标项目文件夹。
单击 Finish。
项目已成功导入,下面将介绍如何在项目中遍历。
遍历大型项目
遍历项目的方法有两种,具体选择哪种取决于您的位置。您可利用 Navigator 视图浏览整个项目。此时可看到一个或多个打开项目的独立文件夹和其中的文件。图 4 给出了一个示例。
图 4. Navigator 视图
选中要在 Editor 中查看的特定文件后,Outline 视图会显示已导入文件中的模块以及文件内定义的所有子例程。两者结合在一起,使文件布局和功能更易于理解。要跳过特定子例程,可在 Outline 视图内双击其名称。图 5 给出了一个 Outline 视图窗口的示例。
图 5. Outline 视图
EPIC 的 AutoLoader 限制
值得注意的是,某些流行的 Perl 结构和技术在 EPIC/Eclipse 中无法使用。AutoLoader 系统中就存在着一个这样的限制,该系统提供了一种灵活、高效的途径,可将模块分割成较小的文件,在执行期间自动载入。
AutoLoader 系统的工作方式是,将除存根自动加载器 (stub auto-loader) 以外的所有代码置入文件的文本部分中。这一文本部分通常用于存储脚本数据(而非使用外部文件来存储),因此假设它将会被忽略是安全的。但遗憾的是,这也意味着 Eclipse 会完全忽略此代码。
代码折叠
可读性使代码易于理解,对调试代码大有裨益。EPIC 插件提供的工具首先使代码具有良好的格式,从而更具可读性,并且更容易隐藏不再需要或不再希望看到的子例程及组件。
代码折叠 使您能够隐藏给定子例程的定义。除了子例程声明存根依然显示外,子例程代码定义的其他部分都可隐藏。
如果在编辑器窗口中查看 RSS Feeder 脚本,将看到各子例程左侧列中有一个短线标记,如图 6 所示。
图 6. 折叠前代码中的子例程
查看原图(大图)
若单击 parse_items_to_text() 旁的短线标记,整个子例程定义将隐藏起来。关于折叠后的子例程定义示例,请参加图 7。
图 7. 折叠后的子例程
折叠后原短线标记将变为加号标记(强调代码已折叠)。单击加号标记将立即展开代码,重新显示出定义。
运行 Perl 应用程序
现在,您应该对如何利用 EPIC 简便地遍历项目有了很好的理解。但在开始调试应用程序之前,应首先了解一下如何运行应用程序。要运行应用程序,需要创建一个新的运行配置。
RSS Feeder 应用程序
RSS Feeder 应用程序的基础知识已在 "Build Perl applications with Eclipse" 教程中介绍过。为方便起见,清单 3 中给出了本教程后面将用到的脚本。 清单 3. RSS Feeder 脚本
use strict;
use warnings;
use XML::RSS;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new();
my $feeds = { "MCslp" => 'http://www.mcslp.com/wp-rss2.php' };
foreach my $feed ( sort keys %{$feeds} )
{
my ($rss) = parse_rss_fromurl( $feeds, $ua, $feed );
parse_items_to_text($rss);
}
sub parse_rss_fromurl
{
my $feeds = shift;
my $ua = shift;
my $feed = shift;
my $response = $ua->get( $feeds->{$feed} );
my $rss;
if ( $response->is_success )
{
$rss = XML::RSS->new();
$rss->parse( $response->{_content} );
}
return ($rss);
}
sub parse_items_to_text
{
my ($feed) = @_;
foreach my $i ( @{ $feed->{items} } )
{
next unless defined($i);
my $len = length( $i->{"title"} );
print($i->{"title"},
"\n",
( '=' x $len ),
"\n",
$i->{"description"},
"\n\n",
$i->{"link"},
"\n\n" );
}
} 这段脚本由一个处理散列的基本循环构成,首先下载 RSS 提要源(使用 LWP),然后解析源(使用 XML::RSS)。所得到的对象将用于输出 RSS 提要项的简单文本表示。 为执行而配置应用程序
在介绍调试的细节之前,您首先应了解运行当前在 Eclipse 内开发的应用程序的基础知识。本节将延用介绍在 Eclipse 中开发 Perl 应用程序的教程中所生成的 RSS Feeder 应用程序。我已利用本教程前面所介绍的技术将此应用程序的文件导入系统。
请按以下步骤配置欲执行的项目中的脚本:
从 Run 菜单中选择 Run。您将看到一个如图 8 所示的对话框:
图 8. 设置默认 Run 配置
查看原图(大图)
选择 Perl Local 项,并配置在调试或运行一个本地 Perl 脚本(非远程或 CGI)时所使用的透视图。运行脚本时,您的透视图将自动切换为此处所配置的透视图。
确保在此对话框左侧的配置列表中选中了 Perl Local,且选择了 New。您将看到用于创建新 Run 配置的对话框,如图 9 所示。
图 9. 添加新 Run 配置
查看原图(大图)
配置您想执行的项目和脚本的名称。请注意,您也可以向脚本中添加任何命令行选项。切记添加配置名称,务必注意此配置特定于此项目中的此脚本。
您也可以通过 Conmon 面板设置特定选项,例如将输出发送到哪里、是否将此添加到 Run 菜单的可用脚本中以执行、是否启用控制台等(参见图 10)。
图 10. Common 配置面板
查看原图(大图)
单击 Apply,再单击 Close 保存配置。
激活配置后,即可随时运行您的脚本。
运行您的应用程序
既然已经获得了活动的 Run 配置,您就可以执行您的脚本,并测定它是否按照您期待的方式工作。
第一次运行您所配置的脚本时,需要手动选择配置。但这样的手动选择仅需一次,此后可在 Run 菜单中直接将其作为 "历史" 项目选择并再次运行。您还可编辑 Run 配置选项,明确地将该脚本添加到 Run 菜单中。
初次运行您的配置时,请按以下步骤进行操作:
从 Run 菜单中选择 Run。
从左侧的配置列表中选择配置。
选择 Run。
您的脚本将被执行,且其输出被发送到 Eclipse Console。
如果您未在 Eclipse 中打开 Console 视图,可在 Window 菜单中选择 Console 视图打开它。
图 11 展示了此 RSS Feeder 脚本的部分输出示例。
图 11. RSS Feeder 脚本的控制台输出
查看原图(大图)
您未必希望只是单纯地运行应用程序,而不通过某种方式监控或处理应用程序,下面我们将就此进行介绍。
与您的应用程序交互
对于基本的文本脚本或通过标准输入/输出实现大多数交互的应用程序来说,Eclipse 的 Console 视图足以应付。当然,通过此界面能实现的交互是有限的,您可能会希望至少要增加控制台视图的大小,使其更便于使用。
如果您创建了一个运行配置的 CGI,执行模型会略有不同。原因在于 EPIC 创建到脚本的临时 CGI 接口的方式,以及通过内置 Web 客户机或第三方客户机 -- 如 Internet Explorer、Safari 或 Firefox -- 提供 CGI 输出的方式。
在您调试 -- 而非单纯地执行 -- 应用程序时,CGI 脚本接口充分的交互性更有意义。调试通常需要较多的交互,因此下面我们将介绍调试过程中脚本执行的细节。
调试标准应用程序
既然您已经理解了如何利用 EPIC 遍历项目并运行应用程序,那么下面将开始介绍标准应用程序的调试。
需要您完成的工作仅仅是将标准 Run 环境的配置更改为调试配置。Eclipse 随后会提供一个调试透视图,该透视图支持标准调试工具(如断点),并且能够使您在执行过程中查看变量。
为调试而配置应用程序
请按以下步骤配置项目中要调试的脚本:
从 Run 菜单中选择 Debug。您将看到如图 12 所示的对话框。
图 12. 调试配置
查看原图(大图)
选择 Perl Local 项,并配置在调试本地 Perl 脚本(非远程或 CGI)时所使用的透视图。运行脚本时,您的视图将自动切换为此处所配置的透视图。由于您是为调试而进行配置,所以请选择 Eclipse Debug 透视图。
您可以选择创建新配置,也可使用现有配置。要创建新配置,请在本对话框左侧的配置列表中选择 Perl Local,然后单击 NewY。随后将看到用于创建新 Debug 配置的对话框,如图 13 所示。
图 13. 添加新 Debug 配置
查看原图(大图)
配置要执行的项目和脚本的名称,请注意,您也可以向脚本中添加任何命令行选项。切记添加配置名称,务必注意此配置特定于此项目中的此脚本。
单击 Apply,再单击 Close 保存配置。
激活配置后,即可随时调试您的脚本。单击 Debug 可启动调试过程。
Eclipse 调试界面
Eclipse 的调试透视图为 Eclipse 中的绝大多数调试系统共享和使用,包括在调试 C/C++ 和 Java 应用程序时。图 14 展示了调试透视图的一个示例。
图 14. 调试透视图
查看原图(大图)
调试透视图由多个默认视图构成,包括:
Debug 视图本视图展示了正在运行的脚本,包括单独脚本中的多个线程。图 15 给出了此视图的一个特写。此处该视图中显示的是正在运行的脚本 (Main Thread) 和 Perl Debugger 线程(用作运行脚本的接口)。请注意图中还显示了脚本中执行暂停时所在的行。如果您从视图中选择此项,则源代码中的相应行将显示出来。Variables 视图本视图可用于显示变量值,其输出类似与本教程前面介绍传统调试方法时提到的 Dumper() 函数所产生的输出。后面我们将更详细地介绍如何配置要查看的变量。Breakpoints 视图本视图显示了为所调试的应用程序配置的断点。后面我们将更详细地介绍配置断点的相关内容。
其他视图您应该已比较熟悉,如编辑器视图、项目大纲视图和控制台视图等。
开始调试应用程序后,您会希望开始单步执行代码行,并监控输出。调试器自动在可执行代码的第一行处停止(导入所有模块后)。
单步执行所调试的应用程序
单步执行所调试的应用程序使您能够逐行、逐函数调用地监控脚本的执行。通过单步执行,您可以通过函数调用、测试语句等跟踪执行,还可在代码执行期间监控变量值。
Eclipse 支持 5 种 step 模式,但在大多数情况下,EPCI 插件仅支持前三种。可利用工具栏上的 Step 按钮(工具栏面板右侧的后 5 个按钮):
Step Into -- 进入函数、循环或其他语句。若函数可用,调试器将显示源代码,并允许您单步执行源代码。
Step Over -- 跳过一条语句,转向代码中的下一条语句。
Step return -- 若您已进入函数,则执行函数中的全部代码,包括其返回语句。
您可以单击 "Play" 按钮(正是您的 VCR play 按钮)重新开始执行,直到预先配置好的断点或脚本末 -- 以先满足的条件为准 -- 处停止,利用类似于 VCR 的 Pause 按钮暂停,使用 Stop 按钮完全停止执行。
如果您停止了执行,想在同一脚本上重新启动调试过程,可右击过程,并在菜单中选择 Relaunch。
添加/删除断点
有时您希望在脚本执行过程中暂停或停止执行,断点正是代码中执行暂停或停止时所在的行。可想而知,断点的功能正是在该点中断执行。
为配置断点,请在源代码中要添加断点的行旁边的边框处右击。
您将看到一个提示菜单,允许您在代码此处添加断点。在设置断点时,您会发现启用行号是非常有用的(通过同一提示菜单即可实现)。
添加断点后,代码行旁会出现一个断点图标,如图 15 所示。断点图标显示在源代码第 6 行的旁边。
图 15. 带有断点的代码
查看原图(大图)
您还可以使用 Breakpoints 视图访问已配置断点的列表(如图 16 所示),其中列出了项目中所有已配置断点的类型、文件和行号。
图 16. Breakpoints 视图
要删除断点,可在源代码相应行处再次右击并选择 Remove Breakpoint,也可从断点列表中选择要删除的断点,然后右击它,按同样方式删除。您还可以启用和禁用断点,若您在调试同一代码且想监控相同的位置,但不必同时进行监控,那么这一功能是很方便的。
监控变量
选中正在运行的线程后,当前范围内的全部变量将以列表形式显示在 Variables 视图中。图 17 给出了 Variables 视图的示例。
图 17. 调试器变量
对绝大多数调试器而言,仅在您明确将变量添加到要监控的变量列表后才能显示变量,EPIC 调试器与此不同,它会自动显示当前范围内的所有变量。如您所见,这里也显示了变量的全部细节信息,您可以使用树型界面来审查脚本中像嵌套数组和散列这样的复杂结构的值。请注意,本地变量带有一个包含 "L" 的图标,其他所有变量则使用标准变量图标。
在上一次执行后发生了变化的变量会以红色突出显示。这使得在单步执行应用程序时寻找所更改的变量变得轻而易举。
除在您的脚本中所定义的变量外(包括当前块的全局变量和局部变量),变量视图还会默认地显示脚本中间接使用的一些全局变量。例如,它会显示特殊 STDIN、STDOUT 和 STDERR 变量的值。
您还可选择显示内部 Perl 变量(例如 $$、%ENV 等)。单击 View 菜单,选择 Show Perl Internal Variables 即可。图 18 显示了一个启用了此功能的 Variable 视图。
图 18. 显示标准内部变量
切记 Variable 视图仅显示当前范围内的变量或全局变量。它不会显示当前范围内(函数、循环、块,甚至是模块或包)不可用的变量。
调试 Perl CGI 应用程序
至此,您已经了解了使用 EPIC 调试 Perl 应用程序的好处,那么对于 Per CGI 应用程序来说,情况又如何呢?由于 CGI 应用程序是由 Web 服务器执行的,通常通过 Web 浏览器输出其信息,因此调试起来非常困难,除非您使用本教程一开始提到的事后调试技术。但 EPIC 为此类问题提供了一种独特的解决方案。
配置 CGI 调试会话
要调试 Perl CGI 脚本,您需要具备一个正常工作的可用 Web 服务环境,如 Apache 或 IIS,且能够向 IIS 目录中写入信息。EPIC 调试 CGI 应用程序的方式就是作为 Web 服务器与客户机之间的代理。这使其能够控制和监控脚本的执行,即便从技术上来说,脚本是通过 Web 服务器存取的。
请按以下步骤配置 CGI 调试会话:
从 Run 菜单中选择 Debug,打开 Debug 配置窗口。
从可用配置类型列表中选择 Perl CGI 配置。
单击 New 创建新配置。
在 Configuration 面板中(如图 19 所示)选择要调试的项目。可以在 Web Server 面板中按扩展名选择 CGI 脚本。
图 19. Configuration 面板
查看原图(大图)
在 Web Server 控制面板中(如图 20 所示)为已配置的 Web 服务器配置 HTML 和 CGI 目录。您需要将脚本复制到此目录中(可使用 Eclipse 的 Export 函数)。还需要配置在调试时要用到的 "启动" 文件的名称。此文件将在首次访问 Web 服务器时返回,其中应包含到脚本的链接,或使用脚本的表单。
图 20. Web Server 面板
查看原图(大图)
若您需要设置自定义 CGI 环境变量,可使用 CGI Environment 面板来设置这些变量及其值。
在 Browser 面板中,选择您想用于调试脚本的浏览器。我发现内置浏览器往往是最佳选择。
单击 Apply。
单击 Debug 启动调试过程。
调试 Perl CGI 脚本
运行 Perl CGI 脚本后,即可执行在调试标准脚本时所执行的全部功能。您同样可以单步执行、监控变量、设置断点以中断执行。
在图 21 中可看到 Perl CGI 脚本形式的 RSS Feeder 应用程序的执行示例。 图 21. 调试 Perl CGI 脚本
查看原图(大图)
了解了 Eclipse 作为脚本和实际 Web 服务器之间的代理工作的方法后,您就可以控制执行了。甚至可轻而易举地监视和控制脚本中 HTML 的个别输出。以这种方法调试 CGI 脚本时,超时期通常较长,某些浏览器在这种情况下会出现问题。因此我建议使用更能容纳 CGI 调试影响的内置 Web 浏览器。
调试正则表达式
调试正则表达式的艰难程度尽人皆知,调试工作中通常还要构建正则表达式,并根据不同的脚本测试其执行。通过使用交互式的正则表达式测试系统,您可以加快整个过程。EPIC 插件正是这样的一个系统。
如果您向 Eclipse 透视图中添加正则表达式视图(开发或调试时),就可以根据已知值输入和测试单独的正则表达式,而无需为此创建脚本。图 22 显示了工作中的 RegExp 视图。
图 22. 使用正则表达式视图
使用方法时,在顶端的文本框中输入正则表达式,在 Match 文本框中输入作为测试依据的文本。您还可添加选项,如忽略大小写、匹配多行字符串等,只需选中恰当的复选框即可。
若正则表达式正确,则您会看到一个绿色的指示标记。不正确的表达式则为红色,未经核对的表达式为黑色。
视图右侧的按钮用于执行以下操作(由左至右):
Stop execution停止正则表达式的执行。Step backward在有多个元素(例如,多个组)的正则表达式中,此按钮的作用是沿匹配元素向后移动。相应地突出显示匹配文本中匹配的元素。例如,在图 22 所示的正则表达式和匹配文本中,最先匹配的是数字,随后是名称。Step forwardStep forward 将向前遍历正则表达式中的匹配元素。Run在整个文本块上运行正则表达式。成功运行的块将以不同的颜色突出显示,如图 23 所示。
图 23. 运行整个正则表达式
在调试标准脚本时,正则表达式调试器/测试器视图也变为可用。您甚至可以设置一个特殊的正则表达式断点。
现在您应该已经学会了如何利用 EPIC 调试您的 Perl CGI 应用程序。
结束语
在本教程中,我们介绍了调试 Perl 脚本时可以使用的方法。从在传统 Perl 开发环境中所使用的方法开始。总体而言,其中包括两种方式,使用 print() 函数并监控输出或使用 Perl 所提供的调试器。这两种方法都有一些局限性。
利用 EPIC -- Eclipse 的 Perl 开发环境插件,您可以调试 Perl 脚本和 Perl CGI 应用程序。您希望一个调试器具备的一切功能都可以通过 EPIC 获得,包括单步处理、变量监控,以及设置断点并监控脚本的执行。您还可以通过 Eclipse/EPIC 调试 CGI 脚本,利用在 Eclipse 中运行脚本同时直接将脚本输出定位到 Web 浏览器(包括 Eclipse 所提供的内置 Web 浏览器)这样的方式即可。最后,我们还介绍了在脚本内调试正则表达式的方法 -- 特别地,可在开发过程中实现这样的调试。
通过本教程介绍的 EPIC 所提供的功能,以及 "Build Perl applications with Eclipse" 教程中所介绍的功能,您可以了解,该插件提供了一个完整的环境,可使您在 Eclipse 内开发和测试 Perl 应用程序。
2010年09月29日
本教程将介绍 Eclipse 的 EPIC 插件提供的调试功能,该插件提供了功能丰富的调试环境 -- 可为 EPIC Perl 开发环境所用且与此开发环境相集成。本教程假设读者了解 Eclipse 环境,并且有使用 Perl 的经验。
关于本教程
EPIC 结合了两种有助于 Perl 应用程序测试流程的系统:RegExp 和调试器。RegExp 是一个测试 Perl 正则表达式的接口。正则表达式是许多 Perl 应用程序的主要组成部分,但保证表达式的正确性是一个非常复杂的问题。使用 EPIC RegExp 视图,您可以根据已知数据检查结果,测试并修改正则表达式。
EPIC Perl 调试器是一种较为传统的工具,完全集成于 Eclipse 环境之中。除测试本地化脚本外,EPIC 调试器还可用于调试 Web 及远程执行 Perl 脚本,因此是多种环境下的理想工具。
本教程将介绍如何导入和移动大型应用程序、如何简化应用程序视图以使代码更易于理解,从而也更易于调试。另外还会介绍 EPIC 调试环境,它完全位于 Eclipse 内部,为标准脚本、CGI 脚本和正则表达式提供了一个完整的调试环境。
前提条件
要开始使用 EPIC,需要满足以下前提条件:
Eclipse V3.1 或 3.0
Java?? 技术 V1.3、1.4 或更高版本
Perl V5.8.6 或更高版本。绝大多数 UNIX??、Linux?? 安装及 Mac OS X 中都包含 Perl。Windows?? 上使用 ActivePerl。
Eclipse 的 EPIC 插件
PadWalker Perl 模块。ActiveState 版本 也可。
传统 Perl 调试技术
在介绍 EPIC 之前,让我们首先来看看 Perl 所使用的传统调试技术,这些技术随时可用,并且确实有一些优点。但它们也有着自身的局限性。理解其局限性有助于您理解为何需要一种更好的调试环境。
Perl 中的调试简介
如果您问一位典型的 Perl 程序员怎样调试其应用程序,他多半会告诉您他只是使用简单的输出语句,在程序执行时转储信息。例如,您可向循环中添加一条简单的语句,来输出您正在计算或处理的值,如清单 1 所示。 清单 1. 使用输出语句进行调试
my $sth = $dbh->prepare($query);
$sth->execute();
while(my $row = $sth->fetchrow_hashref())
{
print STDERR Dumper($row);
printf('%s, %s (%s)',
$row->{album},
$row->{artist},
$row->{genre});
}
$sth->finish(); 在这种情况下,您已输出了从数据库 (MySQL) 载入到 STDERR 的行转储。STDERR 使用起来非常方便,这是因为在 UNIX 主机上,您可将 STDERR 的输出重定位到日志文件,同时使其他输出照常定位到标准输出。
示例中的 Dumper() 函数会实际输出任何变量的结构,包括嵌入式和嵌套的数组、散列及其他内容。输出格式与您手动生成的结构形式相同。此函数(Data::Dumper 模块的一部分)非常有用,既可作为以适于人类阅读的格式输出变量的方法,也可用于写入一个能读回的结构,使用 eval() 可重新创建一个新变量。
事后调试
在应用程序运行时,利用输出信息的输出函数这种方式正是事后调试的一个例子。此时您并未实际监控应用程序的执行,也没有尝试找出应用程序运行过程中的问题,而是将信息转储出来,并等待执行完成。
在交互式调试难以实现的情况下,这一特殊的调试方法广受人们的欢迎。例如,实时调试 CGI 应用程序基本上是不可能实现的,因为应用程序在远程服务器上执行,且由第二应用程序(Web 服务器)执行。不可能实时监控脚本执行。
因此,事后调试有其用武之地,但也有一些显而易见的局限性。举例来说,在不更改代码的情况下,您无法监控任何变量,而一旦更改了代码,您就必须再次运行程序,以获得期望的输出。
同样,您无法逐行单步调试程序的执行。必须运行整个应用程序,除非您强行停止它。如果要跟踪函数调用和序列,就需要添加输出语句,以显示作出的是怎样的决策,并显示顺序与序列,除此之外,别无他法可监控或获得信息。
实时调试
有多种实时调试系统(Perl 自带的调试器就是其中之一),您可从使用 -d 命令行选项入手(参见清单 2)。该命令行选项会启动一个交互式会话,通过此会话即可逐行单步调试、跳过代码段、监控变量和值,甚至在执行过程中修改值。 清单 2. 使用 Perl 调试器
$ perl -d -e 0
Loading DB routines from perl5db.pl version 1.28
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(-e:1): 0 本例中的文本界面很清晰,但依然难以理解发生了什么事、显示了什么信息、当前在代码特定部分中的哪处执行。 有一些 GUI 可供 Perl 调试器使用,但通过这些界面能实现的功能依然有限。最重要的是,通过这样的界面调试 Web 应用程序非常困难。
无论在哪种情况下,上述调试系统的主要局限性均在于:它们都是您必须添加到编程工具箱中的其他工具。但任何一种都未为您的开发环境提供集成化的解决方案。
这正是 Eclipse/EPIC Perl 调试器发挥巨大优势的场合。它内置于 Eclipse 系统之中,因此,允许您在同一应用程序内同时实现开发、编辑和调试。
在 EPIC 中导入和处理现有项目
上面已经介绍了传统的 Perl 调试技术,现在是 EPIC 登场的时候了,下面将介绍在项目中遍历的方法 -- 对于代码执行和调试来说,这是一项至关重要的技巧。要研究实现此目标的最佳方法,需要以一个大型项目作为示例。为使项目进入 Eclipse,您将使用导入系统将文件添加到新项目中。
运行导入
要了解如何调试应用程序,一个好方法就是首先将已开发出的应用程序导入您的系统中。这将为您奠定良好的基础,并使您有机会了解如何在大型项目中遍历 -- 在使用调试器接口时,这是一项必备的技巧。
按以下步骤操作即可导入一组现有文件:
若必要,创建一个新项目(若想将文件添加到您自己的项目中,也可使用现有项目)。
在 File 菜单中选择 Import。
从可用导入源清单中选择 File system,参见图 1。
图 1. 选择导入源
单击 Next。
在下一面板中单击 Browse,选择导入操作的源文件夹。文件夹将显示在左侧的面板中。源文件夹中的其他文件夹则以树型结构显示在此列表中。选中文件夹中的文件则显示在右侧的面板中。
单击所显示文件夹旁边的复选框。也可按照同样的机制选择多个独立文件和文件夹。
您可选择至此完成,但有时,您可能不想导入此文件夹中的其他文件。手动选择文件非常复杂,您可利用过滤器自动选择文件导入:
若想仅选择 Perl 文件(通常是以 .pl -- 即脚本、.pm -- 即模块结尾的那些文件),请单击 Filter Types 按钮。
您将看到一个可能文件类型的清单提示(参见图 2)。所有的 Perl 文件类型旁都带有骆驼图标。单击您希望导入的文件类型旁的复选框。
图 2. 选择要导入的文件类型
如果您为 Perl 文件使用了非标准扩展名,可通过 Other Extensions 文本框添加您的扩展名。
确定最终的扩展名清单后,单击 OK。
最好检查一下已选择了哪个文件。从源文件夹中选择的各文件旁应已有复选框。在图 3 中可看到过滤后文件的示例。
图 3. 查看要导入的文件/文件夹
查看原图(大图)
如果确认已选好的导入文件/文件夹无误,即可单击 Into Folder 文本框旁的 Browse 按钮。系统将要求您选择导入文件的目标项目文件夹。
单击 Finish。
项目已成功导入,下面将介绍如何在项目中遍历。
遍历大型项目
遍历项目的方法有两种,具体选择哪种取决于您的位置。您可利用 Navigator 视图浏览整个项目。此时可看到一个或多个打开项目的独立文件夹和其中的文件。图 4 给出了一个示例。
图 4. Navigator 视图
选中要在 Editor 中查看的特定文件后,Outline 视图会显示已导入文件中的模块以及文件内定义的所有子例程。两者结合在一起,使文件布局和功能更易于理解。要跳过特定子例程,可在 Outline 视图内双击其名称。图 5 给出了一个 Outline 视图窗口的示例。
图 5. Outline 视图
EPIC 的 AutoLoader 限制
值得注意的是,某些流行的 Perl 结构和技术在 EPIC/Eclipse 中无法使用。AutoLoader 系统中就存在着一个这样的限制,该系统提供了一种灵活、高效的途径,可将模块分割成较小的文件,在执行期间自动载入。
AutoLoader 系统的工作方式是,将除存根自动加载器 (stub auto-loader) 以外的所有代码置入文件的文本部分中。这一文本部分通常用于存储脚本数据(而非使用外部文件来存储),因此假设它将会被忽略是安全的。但遗憾的是,这也意味着 Eclipse 会完全忽略此代码。
代码折叠
可读性使代码易于理解,对调试代码大有裨益。EPIC 插件提供的工具首先使代码具有良好的格式,从而更具可读性,并且更容易隐藏不再需要或不再希望看到的子例程及组件。
代码折叠 使您能够隐藏给定子例程的定义。除了子例程声明存根依然显示外,子例程代码定义的其他部分都可隐藏。
如果在编辑器窗口中查看 RSS Feeder 脚本,将看到各子例程左侧列中有一个短线标记,如图 6 所示。
图 6. 折叠前代码中的子例程
查看原图(大图)
若单击 parse_items_to_text() 旁的短线标记,整个子例程定义将隐藏起来。关于折叠后的子例程定义示例,请参加图 7。
图 7. 折叠后的子例程
折叠后原短线标记将变为加号标记(强调代码已折叠)。单击加号标记将立即展开代码,重新显示出定义。
运行 Perl 应用程序
现在,您应该对如何利用 EPIC 简便地遍历项目有了很好的理解。但在开始调试应用程序之前,应首先了解一下如何运行应用程序。要运行应用程序,需要创建一个新的运行配置。
RSS Feeder 应用程序
RSS Feeder 应用程序的基础知识已在 "Build Perl applications with Eclipse" 教程中介绍过。为方便起见,清单 3 中给出了本教程后面将用到的脚本。 清单 3. RSS Feeder 脚本
use strict;
use warnings;
use XML::RSS;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new();
my $feeds = { "MCslp" => 'http://www.mcslp.com/wp-rss2.php' };
foreach my $feed ( sort keys %{$feeds} )
{
my ($rss) = parse_rss_fromurl( $feeds, $ua, $feed );
parse_items_to_text($rss);
}
sub parse_rss_fromurl
{
my $feeds = shift;
my $ua = shift;
my $feed = shift;
my $response = $ua->get( $feeds->{$feed} );
my $rss;
if ( $response->is_success )
{
$rss = XML::RSS->new();
$rss->parse( $response->{_content} );
}
return ($rss);
}
sub parse_items_to_text
{
my ($feed) = @_;
foreach my $i ( @{ $feed->{items} } )
{
next unless defined($i);
my $len = length( $i->{"title"} );
print($i->{"title"},
"\n",
( '=' x $len ),
"\n",
$i->{"description"},
"\n\n",
$i->{"link"},
"\n\n" );
}
} 这段脚本由一个处理散列的基本循环构成,首先下载 RSS 提要源(使用 LWP),然后解析源(使用 XML::RSS)。所得到的对象将用于输出 RSS 提要项的简单文本表示。 为执行而配置应用程序
在介绍调试的细节之前,您首先应了解运行当前在 Eclipse 内开发的应用程序的基础知识。本节将延用介绍在 Eclipse 中开发 Perl 应用程序的教程中所生成的 RSS Feeder 应用程序。我已利用本教程前面所介绍的技术将此应用程序的文件导入系统。
请按以下步骤配置欲执行的项目中的脚本:
从 Run 菜单中选择 Run。您将看到一个如图 8 所示的对话框:
图 8. 设置默认 Run 配置
查看原图(大图)
选择 Perl Local 项,并配置在调试或运行一个本地 Perl 脚本(非远程或 CGI)时所使用的透视图。运行脚本时,您的透视图将自动切换为此处所配置的透视图。
确保在此对话框左侧的配置列表中选中了 Perl Local,且选择了 New。您将看到用于创建新 Run 配置的对话框,如图 9 所示。
图 9. 添加新 Run 配置
查看原图(大图)
配置您想执行的项目和脚本的名称。请注意,您也可以向脚本中添加任何命令行选项。切记添加配置名称,务必注意此配置特定于此项目中的此脚本。
您也可以通过 Conmon 面板设置特定选项,例如将输出发送到哪里、是否将此添加到 Run 菜单的可用脚本中以执行、是否启用控制台等(参见图 10)。
图 10. Common 配置面板
查看原图(大图)
单击 Apply,再单击 Close 保存配置。
激活配置后,即可随时运行您的脚本。
运行您的应用程序
既然已经获得了活动的 Run 配置,您就可以执行您的脚本,并测定它是否按照您期待的方式工作。
第一次运行您所配置的脚本时,需要手动选择配置。但这样的手动选择仅需一次,此后可在 Run 菜单中直接将其作为 "历史" 项目选择并再次运行。您还可编辑 Run 配置选项,明确地将该脚本添加到 Run 菜单中。
初次运行您的配置时,请按以下步骤进行操作:
从 Run 菜单中选择 Run。
从左侧的配置列表中选择配置。
选择 Run。
您的脚本将被执行,且其输出被发送到 Eclipse Console。
如果您未在 Eclipse 中打开 Console 视图,可在 Window 菜单中选择 Console 视图打开它。
图 11 展示了此 RSS Feeder 脚本的部分输出示例。
图 11. RSS Feeder 脚本的控制台输出
查看原图(大图)
您未必希望只是单纯地运行应用程序,而不通过某种方式监控或处理应用程序,下面我们将就此进行介绍。
与您的应用程序交互
对于基本的文本脚本或通过标准输入/输出实现大多数交互的应用程序来说,Eclipse 的 Console 视图足以应付。当然,通过此界面能实现的交互是有限的,您可能会希望至少要增加控制台视图的大小,使其更便于使用。
如果您创建了一个运行配置的 CGI,执行模型会略有不同。原因在于 EPIC 创建到脚本的临时 CGI 接口的方式,以及通过内置 Web 客户机或第三方客户机 -- 如 Internet Explorer、Safari 或 Firefox -- 提供 CGI 输出的方式。
在您调试 -- 而非单纯地执行 -- 应用程序时,CGI 脚本接口充分的交互性更有意义。调试通常需要较多的交互,因此下面我们将介绍调试过程中脚本执行的细节。
调试标准应用程序
既然您已经理解了如何利用 EPIC 遍历项目并运行应用程序,那么下面将开始介绍标准应用程序的调试。
需要您完成的工作仅仅是将标准 Run 环境的配置更改为调试配置。Eclipse 随后会提供一个调试透视图,该透视图支持标准调试工具(如断点),并且能够使您在执行过程中查看变量。
为调试而配置应用程序
请按以下步骤配置项目中要调试的脚本:
从 Run 菜单中选择 Debug。您将看到如图 12 所示的对话框。
图 12. 调试配置
查看原图(大图)
选择 Perl Local 项,并配置在调试本地 Perl 脚本(非远程或 CGI)时所使用的透视图。运行脚本时,您的视图将自动切换为此处所配置的透视图。由于您是为调试而进行配置,所以请选择 Eclipse Debug 透视图。
您可以选择创建新配置,也可使用现有配置。要创建新配置,请在本对话框左侧的配置列表中选择 Perl Local,然后单击 NewY。随后将看到用于创建新 Debug 配置的对话框,如图 13 所示。
图 13. 添加新 Debug 配置
查看原图(大图)
配置要执行的项目和脚本的名称,请注意,您也可以向脚本中添加任何命令行选项。切记添加配置名称,务必注意此配置特定于此项目中的此脚本。
单击 Apply,再单击 Close 保存配置。
激活配置后,即可随时调试您的脚本。单击 Debug 可启动调试过程。
Eclipse 调试界面
Eclipse 的调试透视图为 Eclipse 中的绝大多数调试系统共享和使用,包括在调试 C/C++ 和 Java 应用程序时。图 14 展示了调试透视图的一个示例。
图 14. 调试透视图
查看原图(大图)
调试透视图由多个默认视图构成,包括:
Debug 视图本视图展示了正在运行的脚本,包括单独脚本中的多个线程。图 15 给出了此视图的一个特写。此处该视图中显示的是正在运行的脚本 (Main Thread) 和 Perl Debugger 线程(用作运行脚本的接口)。请注意图中还显示了脚本中执行暂停时所在的行。如果您从视图中选择此项,则源代码中的相应行将显示出来。Variables 视图本视图可用于显示变量值,其输出类似与本教程前面介绍传统调试方法时提到的 Dumper() 函数所产生的输出。后面我们将更详细地介绍如何配置要查看的变量。Breakpoints 视图本视图显示了为所调试的应用程序配置的断点。后面我们将更详细地介绍配置断点的相关内容。
其他视图您应该已比较熟悉,如编辑器视图、项目大纲视图和控制台视图等。
开始调试应用程序后,您会希望开始单步执行代码行,并监控输出。调试器自动在可执行代码的第一行处停止(导入所有模块后)。
单步执行所调试的应用程序
单步执行所调试的应用程序使您能够逐行、逐函数调用地监控脚本的执行。通过单步执行,您可以通过函数调用、测试语句等跟踪执行,还可在代码执行期间监控变量值。
Eclipse 支持 5 种 step 模式,但在大多数情况下,EPCI 插件仅支持前三种。可利用工具栏上的 Step 按钮(工具栏面板右侧的后 5 个按钮):
Step Into -- 进入函数、循环或其他语句。若函数可用,调试器将显示源代码,并允许您单步执行源代码。
Step Over -- 跳过一条语句,转向代码中的下一条语句。
Step return -- 若您已进入函数,则执行函数中的全部代码,包括其返回语句。
您可以单击 "Play" 按钮(正是您的 VCR play 按钮)重新开始执行,直到预先配置好的断点或脚本末 -- 以先满足的条件为准 -- 处停止,利用类似于 VCR 的 Pause 按钮暂停,使用 Stop 按钮完全停止执行。
如果您停止了执行,想在同一脚本上重新启动调试过程,可右击过程,并在菜单中选择 Relaunch。
添加/删除断点
有时您希望在脚本执行过程中暂停或停止执行,断点正是代码中执行暂停或停止时所在的行。可想而知,断点的功能正是在该点中断执行。
为配置断点,请在源代码中要添加断点的行旁边的边框处右击。
您将看到一个提示菜单,允许您在代码此处添加断点。在设置断点时,您会发现启用行号是非常有用的(通过同一提示菜单即可实现)。
添加断点后,代码行旁会出现一个断点图标,如图 15 所示。断点图标显示在源代码第 6 行的旁边。
图 15. 带有断点的代码
查看原图(大图)
您还可以使用 Breakpoints 视图访问已配置断点的列表(如图 16 所示),其中列出了项目中所有已配置断点的类型、文件和行号。
图 16. Breakpoints 视图
要删除断点,可在源代码相应行处再次右击并选择 Remove Breakpoint,也可从断点列表中选择要删除的断点,然后右击它,按同样方式删除。您还可以启用和禁用断点,若您在调试同一代码且想监控相同的位置,但不必同时进行监控,那么这一功能是很方便的。
监控变量
选中正在运行的线程后,当前范围内的全部变量将以列表形式显示在 Variables 视图中。图 17 给出了 Variables 视图的示例。
图 17. 调试器变量
对绝大多数调试器而言,仅在您明确将变量添加到要监控的变量列表后才能显示变量,EPIC 调试器与此不同,它会自动显示当前范围内的所有变量。如您所见,这里也显示了变量的全部细节信息,您可以使用树型界面来审查脚本中像嵌套数组和散列这样的复杂结构的值。请注意,本地变量带有一个包含 "L" 的图标,其他所有变量则使用标准变量图标。
在上一次执行后发生了变化的变量会以红色突出显示。这使得在单步执行应用程序时寻找所更改的变量变得轻而易举。
除在您的脚本中所定义的变量外(包括当前块的全局变量和局部变量),变量视图还会默认地显示脚本中间接使用的一些全局变量。例如,它会显示特殊 STDIN、STDOUT 和 STDERR 变量的值。
您还可选择显示内部 Perl 变量(例如 $$、%ENV 等)。单击 View 菜单,选择 Show Perl Internal Variables 即可。图 18 显示了一个启用了此功能的 Variable 视图。
图 18. 显示标准内部变量
切记 Variable 视图仅显示当前范围内的变量或全局变量。它不会显示当前范围内(函数、循环、块,甚至是模块或包)不可用的变量。
调试 Perl CGI 应用程序
至此,您已经了解了使用 EPIC 调试 Perl 应用程序的好处,那么对于 Per CGI 应用程序来说,情况又如何呢?由于 CGI 应用程序是由 Web 服务器执行的,通常通过 Web 浏览器输出其信息,因此调试起来非常困难,除非您使用本教程一开始提到的事后调试技术。但 EPIC 为此类问题提供了一种独特的解决方案。
配置 CGI 调试会话
要调试 Perl CGI 脚本,您需要具备一个正常工作的可用 Web 服务环境,如 Apache 或 IIS,且能够向 IIS 目录中写入信息。EPIC 调试 CGI 应用程序的方式就是作为 Web 服务器与客户机之间的代理。这使其能够控制和监控脚本的执行,即便从技术上来说,脚本是通过 Web 服务器存取的。
请按以下步骤配置 CGI 调试会话:
从 Run 菜单中选择 Debug,打开 Debug 配置窗口。
从可用配置类型列表中选择 Perl CGI 配置。
单击 New 创建新配置。
在 Configuration 面板中(如图 19 所示)选择要调试的项目。可以在 Web Server 面板中按扩展名选择 CGI 脚本。
图 19. Configuration 面板
查看原图(大图)
在 Web Server 控制面板中(如图 20 所示)为已配置的 Web 服务器配置 HTML 和 CGI 目录。您需要将脚本复制到此目录中(可使用 Eclipse 的 Export 函数)。还需要配置在调试时要用到的 "启动" 文件的名称。此文件将在首次访问 Web 服务器时返回,其中应包含到脚本的链接,或使用脚本的表单。
图 20. Web Server 面板
查看原图(大图)
若您需要设置自定义 CGI 环境变量,可使用 CGI Environment 面板来设置这些变量及其值。
在 Browser 面板中,选择您想用于调试脚本的浏览器。我发现内置浏览器往往是最佳选择。
单击 Apply。
单击 Debug 启动调试过程。
调试 Perl CGI 脚本
运行 Perl CGI 脚本后,即可执行在调试标准脚本时所执行的全部功能。您同样可以单步执行、监控变量、设置断点以中断执行。
在图 21 中可看到 Perl CGI 脚本形式的 RSS Feeder 应用程序的执行示例。 图 21. 调试 Perl CGI 脚本
查看原图(大图)
了解了 Eclipse 作为脚本和实际 Web 服务器之间的代理工作的方法后,您就可以控制执行了。甚至可轻而易举地监视和控制脚本中 HTML 的个别输出。以这种方法调试 CGI 脚本时,超时期通常较长,某些浏览器在这种情况下会出现问题。因此我建议使用更能容纳 CGI 调试影响的内置 Web 浏览器。
调试正则表达式
调试正则表达式的艰难程度尽人皆知,调试工作中通常还要构建正则表达式,并根据不同的脚本测试其执行。通过使用交互式的正则表达式测试系统,您可以加快整个过程。EPIC 插件正是这样的一个系统。
如果您向 Eclipse 透视图中添加正则表达式视图(开发或调试时),就可以根据已知值输入和测试单独的正则表达式,而无需为此创建脚本。图 22 显示了工作中的 RegExp 视图。
图 22. 使用正则表达式视图
使用方法时,在顶端的文本框中输入正则表达式,在 Match 文本框中输入作为测试依据的文本。您还可添加选项,如忽略大小写、匹配多行字符串等,只需选中恰当的复选框即可。
若正则表达式正确,则您会看到一个绿色的指示标记。不正确的表达式则为红色,未经核对的表达式为黑色。
视图右侧的按钮用于执行以下操作(由左至右):
Stop execution停止正则表达式的执行。Step backward在有多个元素(例如,多个组)的正则表达式中,此按钮的作用是沿匹配元素向后移动。相应地突出显示匹配文本中匹配的元素。例如,在图 22 所示的正则表达式和匹配文本中,最先匹配的是数字,随后是名称。Step forwardStep forward 将向前遍历正则表达式中的匹配元素。Run在整个文本块上运行正则表达式。成功运行的块将以不同的颜色突出显示,如图 23 所示。
图 23. 运行整个正则表达式
在调试标准脚本时,正则表达式调试器/测试器视图也变为可用。您甚至可以设置一个特殊的正则表达式断点。
现在您应该已经学会了如何利用 EPIC 调试您的 Perl CGI 应用程序。
结束语
在本教程中,我们介绍了调试 Perl 脚本时可以使用的方法。从在传统 Perl 开发环境中所使用的方法开始。总体而言,其中包括两种方式,使用 print() 函数并监控输出或使用 Perl 所提供的调试器。这两种方法都有一些局限性。
利用 EPIC -- Eclipse 的 Perl 开发环境插件,您可以调试 Perl 脚本和 Perl CGI 应用程序。您希望一个调试器具备的一切功能都可以通过 EPIC 获得,包括单步处理、变量监控,以及设置断点并监控脚本的执行。您还可以通过 Eclipse/EPIC 调试 CGI 脚本,利用在 Eclipse 中运行脚本同时直接将脚本输出定位到 Web 浏览器(包括 Eclipse 所提供的内置 Web 浏览器)这样的方式即可。最后,我们还介绍了在脚本内调试正则表达式的方法 -- 特别地,可在开发过程中实现这样的调试。
通过本教程介绍的 EPIC 所提供的功能,以及 "Build Perl applications with Eclipse" 教程中所介绍的功能,您可以了解,该插件提供了一个完整的环境,可使您在 Eclipse 内开发和测试 Perl 应用程序。