来源:
http://my.oschina.net/alphajay/blog/52172
http://www.cnblogs.com/baiyanhuang/archive/2009/11/09/1730726.html
- 1. Perl自带的调试器(功能最全,就是最烦)
Perl调试器的用法:
缺省的Perl调试器就是perl解释器本身,另外还有图形界面的调试器。因为我们在开发程序时一般都使用telnet访问服务器,所以这里主要介绍一下缺省的命令行调试器的用法。
用-d 命令行选项启动Perl解释器,例如
perl -d test.pl 即进入Perl调试器的交互界面。
调试命令列表如下:(所有命令都在调试提示符下顶格输入,命令大小写有关)
h:显示调试器的帮助信息。
|h:以分页形式显示调试器的帮助信息。
h h:显示一个压缩的帮助信息。
h 调试命令:显示某个调试命令的帮助。
p 表达式:显示变量或表达式的值,不显示复杂变量嵌入的结构和数据。
x 表达式:显示变量或表达式的值,对较为复杂的变量,以一种可读形式显示嵌入的结构和数据。
V 包名 变量名列表:显示指定包内的所有(或部分)变量的值。(缺省的包名为 main)
X 变量名列表:显示当前包内所有(或部分)变量的值。
注:V、X命令中的变量名列表以空格分隔且变量名前应去掉$、@或%
T:程序的调用栈回退一级。
s 表达式:单步执行,进入子函数。(step into) 如果提供一个表达式并且表达式中包括函数调用,则单步进入该函数内。
n 表达式:单步执行,越过子函数。(step over) 如果提供一个表达式,则只是表示执行本表达式。
c 行号/函数名:执行到某一行或某一个函数停住。 行号/函数名如果没有,则表示继续执行。
l:显示未执行的一窗(一屏)文件内容。
l min-max:显示第min到第max行的文件内容。
l 行号:显示指定行的内容。
l 函数名:显示指定函数的一窗(一屏)文件内容。
w 行号:显示某行周围一窗(一屏)文件内容。
f 文件名:切换到另一个文件。
/模式:在当前文件中向前(文件尾)查找匹配的字符串。
?模式:在当前文件中向后(文件头)查找匹配的字符串。
L:显示所有断点和附加操作。
S 模式:显示匹配(或不匹配,在模式前加!)的函数名。
t:切换跟踪模式。
t 表达式:跟踪执行表达式过程。
b 行号 条件:在某一行设置一个断点,当程序执行到该行并且条件满足时,产生中断。 条件可省,表示一直满足。
b 函数名 条件:在某函数上设置一个断点,当程序执行到该函数并且条件满足时,产生中断。 条件可省,表示一直满足。
b load 文件名:在某个文件的第一个可执行语句上设置一个断点。
d 行号:删除某一行的断点。
D:删除所有断点。
a 行号 命令:给程序的某一行加一个附加操作。在执行该行语句前先执行附加的操作。
A:删除所有已安装的附加操作。
W 表达式:增加一个监视项。
W:删除所有监视项。
O 选项名?:查询调试器可选项的值。
O 选项名=选项值:设置调试器可选项的值。
lt Perl语句:设置一个操作显示调试提示符前执行的操作。
ltlt Perl语句:增加一个显示调试提示符前执行的操作。
gt Perl语句:设置一个离开调试提示符(转入运行态)时执行的操作。
gtgt Perl语句:增加一个离开调试提示符(转入运行态)时执行的操作。
{ 调试命令:设置一个操作显示调试提示符前执行的操作。
{{ 调试命令:设置一个操作显示调试提示符前执行的操作。
注:上述Perl语句和调试命令均可输入多行,行尾以/转义。
!number:重新执行以前第number次执行的调试命令。
!-number:重新执行现在以前number次执行的调试命令。
!模式:重新执行以前执行过的与模式匹配的调试命令。
!!命令:不退出调试器执行一个shell命令。
H-number:显示以前执行的number条调试命令。如果省略number,则显示所有执行过的
调试命令。
R:重新启动正在调试的程序。
q或^D:退出调试器。
|调试命令:将调试命令的输出分页显示。
||调试命令:类似|调试命令,适于有大量输出的调试命令,例如:|V main。
= 别名 值:给某个调试命令一个别名,例如:= quit q。
source 文件:执行文件中的perl调试命令
所有未识别的命令:当作插入的一条Perl语句执行。(使用eval)
Perl调试器的功能还有很多,可以设置很多选项来定制调试器的环境,它本身也是用Perl开发的,并且Perl发布中还有接口让你能开发其它的Perl调试器。
如果要用Perl开发大的项目,有必要详细了解这些细节。使用调试器和设置调试器选项的例子请参考Perl发布中关于perldebug的文档。
perl -d filename
这句是进入perl的调试命令
然后屏幕上会出现如下字样:
Enter h or `h h\' for help, or `man perldebug\' for more help.
main::(filename:linenumber)
linenumber: content;
DB<1>
filename即所调试的文件名,linenumber显示的是当前调试语句的行号,content也即当前调试的语句,DB<1>后跟着黑色小方块的光标 <>中的1表示准备执行第几条调试命令
1、此时可以输入n,相当于Visual Studio中的F10,进入下一句的调试
2、如果想直接运行到第N行语句,可以在第N行处设置一个断点:b N (将N替换为需要设置断点的行
号),回车后断点设置成功,可以输入L来查看所设置的所有断点情况,不想查看也可以直接输入c,
回车后就直接运行到设置断点的语句处了
3、想要删除断点可以用 B N (将N替换为需要设置断点的行号),回车后所在行处的断点即被删除,
也可以通过B *来删除所有的断点
4、想要查看变量的值,通过print 变量名 就可以查看了
5、也可以通过给变量赋值来直接改变调试中脚本里的变量的值,比如直接输入:$debug = 0,这样
$debug的值就被赋为0了
6、退出调试,只要输入q即可
来源:http://www.cnblogs.com/itech/p/5284739.html
b line_number
b line_number file_path_name
b function_name
b function_name file_path_name
f file_path_name
b file_path_name:function_name
具体帮助参见:
http://docs.activestate.com/activeperl/5.8/lib/pods/perldebug.html
- 2. Komodo IDE(非常不错,就是不免费,但是有破解)
这是一个由ActiveState发布的针对动态语言的跨平台的集成开发环境。
所谓跨平台,其支持所谓Mac,Linux,Windows;
所谓集成开发环境,其支持代码编辑与调试
所谓动态语言,其除了支持perl,还支持狂多其他动态语言,如python,TCL, Ruby,PHP, Google Go, PHTML/CSS and JavaScript.等等。
[Tools]-[Add-ons]那边可以下到Emmet(formerly Zen Coding) (是一个toolkit,能够提高HTML&CSS的编码速度)
熟悉Visual Studio的同学可能会觉得很面熟。
详细说明可以参考其官方网站:https://www.activestate.com/komodo/
下载地址是:https://www.activestate.com/activeperl_pro_studio/downloads/
这的确是一个非常强大的工具,但是295$的价钱实在拒人于千里。21天的试用期到了,你的脚本还没完成,怎么办?
一般来说,每一个成功的商业软件背后,都会有一个好用(至少是可用)的免费软件。对于调试perl,我们至少还是另外一个选择:
官网:http://komodoide.com/
Komodo supports all your major languages, including Python, PHP, Go, Perl, Tcl, Ruby, NodeJS, HTML, CSS, JavaScript and more.
Komodo IDE收费的(能调试perl),Komodo Edit是免费的(不能调试perl)。
Komodo Edit是开源免费的高级文本编辑器,基于Mozilla XUL开发,完美跨平台,支持Windows,Linux,Mac,为Linux提供有通用二进制版本,解压即用.
Komodo占用的内存至少比Java based IDE少1倍,速度也更快,界面也更美观,对输入法兼容良好.
比如Komodo Edit在PHP文件里支持PHP/HTML/CSS/JS(jQuery等库)智能提示,支持语法错误提示,通过使用第三方扩展NST实现函数变量列表.
无论你是PHP/Python/Ruby开发者,Komodo Edit都值得一试.Komodo还提供有21天试用的商业付费的Komodo IDE,不妨一试.
free 21-day trial.
ACTIVEPERL PRO STUDIO: KOMODO, PDK
If you\'re looking for an IDE and want to use Perl Dev Kit (PDK), then ActivePerl Pro Studio is the right product for you. You get licenses for PDK and Komodo IDE
不过我有9.0的破解版,很好用!
- 3. Notepad++ & ptkdb(不错,免费)
N++是个Windows下比较好用也比较有名的编辑器了,这里不再赘述,不熟悉的同学可以参考这里。 Notepad++比Ultraedit强(除了没有列出选中列表功能外)
当然,您要喜欢Komodo IDE的风格,它们提供了一个免费的Komodo Edit.
编辑器有了,调试器的任务就由ptkdb承担了:
ptkdb is a free/open source debugger for Perl with graphical user interface (GUI) based on Perk/Tk.
ptkdb is able to run on almost any operating system.
免费,跨平台,有GUI,应该是可以满足我们的要求了。
<
当然,其界面美观度和可操控性都没有Komodo IDE来的好,但是知足吧,有这么一个免费的工具用,已经很不错了。
下面介绍一下如何配打造这套"土IDE"
- 安装perl
对于windows下的用户,可以从activestate网站下载最新的perl安装包:https://www.activestate.com/activeperl/,注意安装的时候路径名不要太长,也不能有空格。
- 安装tk
tk是一个图形界面库,是由tcl引到perl中来的,ptkdb依赖于此GUI库显示界面。可以直接在cmd窗口:
ppm install tk
- 安装ptkdb
安装命令为:
如果用此命令安装失败的话,我们需要手动下载并将模块解压到:C:\Perl\Lib\Devel,当然,请把C:\Perl替换为你的安装路径。ppm install devel::ptkdb
- 与Notepad++的集成
至此,如果你想调试某个script的话,需要:
但既然我们在Notepad++中开发脚本,而Notepad++提供了与外部工具集成的机制,我们就可以非常方便的执行一个菜单命令来调试当前的脚本:perl -d:ptkdb test.pl
输入命令:
Perl.exe -d:ptkdb "$(FULL_CURRENT_PATH)"
然后save为一个run菜单命令,一切就ok了。
突然间有自己写个perl IDE的冲动~~~
如果是调试CGI,可能要本地运行一个X Windows服务器。
关于调试CGI,参见《CGI编程-使用Perl》 P420
- 4. Ecplise 插件 EPIC (不错,免费。EPIC 调试器还可用于调试 Web(Perl CGI) 及远程调试 Perl 脚本(Perl Remote))
参见:
4.1利用 Ecplise 插件 EPIC 调试 Perl 程序
来源:http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-epic/
这篇文章将详细介绍 EPIC 组件的安装,EPIC 编辑环境,调试运行环境,着重介绍如何使用 EPIC 来快速、简便、准确地调试 Perl 语言程序,包括对于 Perl 程序的单步执行,断点用法,局部、全局变量实时监控,子函数执行监控,错误以及警告信息实时显示等等内容。利用 EPIC 强大编辑以及调试功能,可以将 Perl 语言适合花短时间完成程序的特点发挥地淋漓尽致,为 tester 的自动化测试脚本提供更加人性化的设计、调试环境。
引言
Perl 语言是众所周知的一种编程语言,被广泛地用于日常生活的方方面面,它从最早的文本处理语言开始,已经发展成为一种非常复杂得,通用得编程语言。因为 Perl 几乎可以在任何地方运行,所以 Perl 可以说是当今最具有移植性得编程环境。Perl 擅长写那些需要在短时间内完成的程序,对于那些需要数十个程序员,花费数年的程序,Perl 也能很好地胜任,当然,更多的情况是你将写那些从开始构思到实际测试代码只需几十分钟的程序,Perl 被设计为:90% 处理文本,10% 针对其它情况。Perl 语言的这一系列特点,为自动化测试脚本的实现提供了无与伦比编程环境,可以说 perl 语言是自动化测试脚本的‘温床’。作为一名 tester,利用 perl 语言编写自动化测试脚本是一件酣畅淋漓得快事,但是对于编写好的 perl 程序脚本,目前有个问题摆在我们面前,那就是 Perl 语言程序的调试实在是一个令人崩溃的过程,许多 Perl 程序的语法检查以及运行中间结果都需要依靠若干没有实际用途的打印语句来实现,基于这一特点,Perl 程序调试又被世人戏谑为‘死后验尸式调试’。面对 Perl 语言的这一问题,基于 Eclipse 平台的插件 EPIC 诞生了,作为开源软件 Perl 语言的 IDE( 包括编辑器和调试器 )。可以应用于 windows, Linux 以及 Mac 平台。无论是 CGI 脚本还是复杂地拥有数百个模块的 perl 程序项目,它丰富的功能都可以为您提供快捷,便利的实时调试环境。
这篇文章将详细介绍 EPIC 组件的安装,EPIC 编辑环境,调试运行环境,着重介绍如何使用 EPIC 来快速,简便,准确地调试 Perl 语言程序,包括对于 Perl 程序的单步执行,断点用法,局部、全局变量实时监控,子函数执行监控,错误以及警告信息实时显示等等内容。利用 EPIC 强大编辑以及调试功能,可以将 Perl 语言适合花短时间完成程序的特点发挥的淋漓尽致。为 tester 的自动化测试脚本提供更加人性化的设计环境。
EPIC 安装功略
安装前准备
安装之前需要准备几个重要的组件:
- Perl 语言编译器
版本要求是 5.8.X 或是 5.6.X,大多数 UNIX/LINUX 安装包都包括了 Perl 语言编译器的选装包,对于 Windows 平台,可以去指定网站下载相应的安装包 www.activestate.com
- Eclipse
在安装 EPIC 插件之前,选择一个最新版本 Eclipse 进行安装是必不可少的步骤,
对于 Eclipse 的版本最低要求是 version 3.1,可以从 [http://www.eclipse.org] 下
载 Eclipse 安装包。
由于 Eclipse 安装包不包括 Java Runtime Environment(JRE),为此,我们还需要安装
Java 1.4.1 或是更高版本的 Java。
- PadWalker(全局变量跟踪器)
这个模块不是必须要装的,它的功能就是在 Debug Perl 程序的过程中,监视全局变量的值。怎么样?不能实时监视全局变量的值是任何一个程序员无法忍受的‘减配’吧,为了发挥 EPIC 比较完整调试功能,千万不要拉下这个模块。可以从 CPAN (PadWalker 0.10) 下载这个包,如果是在 window 平台,可以从 EPIC homepage 下载该模块。
安装 EPIC
使用 Eclipse 软件的 Eclipse Update Manager 功能去安装 EPIC。
打开 Eclipse, 进入菜单 Help->Software and Updates ->Find and Install...
如图 1 所示:
图 1. EPIC 下载及安装
选择“Search for new features to install” 选择 Next,
选择“Add Update Site... “,在弹出一个对话框中填写用户名和有效的 URL: http://e-p-i-c.sf.net/updates.,
如图 2 所示:
图 2. EPIC 下载网址
继续选择’ Next ’ , 直到完成。
安装 PadWalker(全局变量跟踪器)
- 下载适用于 Perl 5 .8.1 的 PadWalker 压缩软件包。
- 解压以后把文件拷贝到 perl 安装目录,比如 C:\Perl。
EPIC 编辑环境
EPIC 提供了多功能的编辑器,可以方便用户编写 perl 程序,提供了语法高亮显示、语法即时检测、错误以及警告信息注释、Perldoc 查询、变量检查、模块检查、源码折叠等一系列功能,对于编写测试自动化脚本的工程师,书写脚本是整个测试工作的很麻烦的一部分,我们都希望有这个一个利器,能方便快捷地处理这些工作,很幸运,EPIC 帮我们实现了这一切。如图 3 所示:
图 3. EPIC 编辑对话框
配置 Perl 程序运行调试环境
创建工程并输入文件
- 创建一个新工程(也可以在一个已存在的工程中加入你自己的工程)
- 在菜单‘ File ’中选择‘ Import ’,当然,也可以新建文件,并用 EPIC 编辑器来编写相关 Perl 程序,对于 EPIC 编辑器,在上文有相关介绍。
- 从弹出的列表中选择‘ File System ’
如图 4 所示:
图 4. 选择将要导入的文件系统
4. 选择‘ Next ’
5. 在弹出的面板中,单击‘ Browse ’选择要输入文件所在的文件夹,输入文件将会出现在面板上,在此,单击文件前面的复选框,就可以选择要输入到工程中去的文件。如图 5 所示:
图 5. 导入文件
6 .单击‘ Finish ’完成当前工作。
配置 Perl 编译器运行环境
在 Eclipse 环境中,调用 Perl 语言编译器来运行调试工程文件,就必须做相应配置,单击菜单‘ project ’,选择‘ Properties ’,将上一步输入工程的文件的绝对路径填写到弹出面板右侧编辑区。如图 6 所示:
图 6.Include 文件路径
配置调试对话框
首先,对于选中的工程文件,在 EPIC 主界面上选择菜单‘ Run ‘,并在弹出下拉框中选择’ Open Debug Dialog ’,再修改如下配置(选择工程以及要调试的文件):
如图 7 所示:
图 7. 调试对话框配置 1
对于 Perl 程序的运行调试都需要添加 Program Argument,我们可以为新建项目增加 Argument,EPIC 插件也提供了这方面的接口,打开 Debug 对话框,并在项目中 argv items in “(x)= Arguments” 添加相应的 Argument。如图 8 所示:
图 8. 调试对话框配置 2
EPIC 调试运行过程
任何程序的调试与运行都是密不可分的,从程序工程师的角度来看,一个程序从编写完毕到最后成功完成,都是一个运行、修改、调试、再运行、再修改、再调试。。。
的过程。EPIC 提供了完整的调试运行环境。
EPIC 运行程序
对于选中的工程文件,在 EPIC 主界面上选择菜单‘ Run ‘,并在弹出下拉框中选择’ Run ’,如图 9 所示:红线框住的区域表示程序的整个运行过程和结果都可以看到。
图 9. EPIC 运行程序界面
EPIC 调试程序(俗称‘ Debug ’程序)
相比较运行程序而言,这一过程显得复杂得多,这也是这篇文件的精髓所在,前面都是为这一步在做必要地铺垫。对于程序员而言,调试程序是不可避免的,通常将要调试的线程挂起,然后利用单步执行方式来实现对整个程序的一行一行代码地执行,同时,观察每一步运行的结果,以及掌握运行过程中变量的变化情况。
EPIC 提供了多种调试操作功能以方便用户实现在编程中的切实需求,包括单步执行、跳入子函数、跳出子函数、断点设置、断点取消、直接执行语句段直至断点位置等等。
- Step Over– 单步执行函数、循环 loop、或执行其他普通语句。正待执行的代码行在 EPIC 编辑器中会被高亮显示出来,此时,线程处于挂起状态,在 Debug 视图工具条中按下这个功能图标 ()(相应的快捷键是‘ F6 ’)后,该行语句将被执行,完毕后,将自动跳转到下一行待执行语句,并使其呈高亮显示状态,该线程继续挂起等待下一步指令。
- Step Into– 可以执行进入函数、循环 loop、或执行其他普通语句。在 Debug 视图工具条中按下这个功能图标 ()(相应的快捷键是‘ F5 ’),该功能类同上述‘ Step Over ’,不同之处在与:如果该语句中含有子函数,循环等结构,‘ Step Over ’是直接后台执行完这些子函数或是循环,并返回结果。但是‘ Step Into ’却会按执行栈的顺序执行方式,依次跳入子函数或循环提供单步执行的功能。
- Step Return– 这一功能是针对执行过程已经进入子函数后,可以从当前代码行开始直接后台执行完该子函数剩余代码并返回,不用再单步执行该子函数。在 Debug 视图工具条中按下这个功能图标 ()(相应的快捷键是‘ F7 ’)。
4. 如果要直接后台执行到最近的下一个程序断点位置可以使用快捷键‘ F8 ‘来实现这一功能。
在主界面中选择菜单‘ Run ‘ -> ’ Debug ’ , 就进入程序调试状态了,我们可以选择调试操作方
式,包括单步执行、跳到最近的下一个断点再执行,跳入子函数等等,针对这些操作过程中,
对于工程师来说,始终关注的都是整个程序的运转情况以及掌握每一步执行操作完成后相关变
量的变化情况,为此,我们有必要介绍一些视图,利用这些视图,我们可以更好的掌握程序的
调试状况,以利于下一步操作。
首先,进入调试界面接口,可以在主界面中选择:Window-> Show View ->Debug,在弹出来的
视图里,可以管理在工作区的正在被调试或是运行程序,它显示了一个工程框架、工作过程中
的程序运行状况等等。如图 10 所示:
图 10. EPIC 调试窗口
变量视图能够显示程序在运行过程中的变量的值以及其实时变化情况,这一功能对于调试工作来说是尤为重要的,变量是程序的‘血液‘,程序代码就是通过变量来连接的,掌握变量的情况,就是掌握整个程序的运行状况。
在变量视图里面,可以看到变量栈的框架结构,它显示变量的原始状态,包括结构体变量、哈希变量、list 变量或是对象等等。
全局变量(包括 Perl 内部变量)都有特定图标 , 标注,本地变量有特定图标 (如前文
介绍,本地变量必须是安装了 PadWalker 模块才能看见)。
如图 11 所示:
图 11. EPIC 调试窗口
断点视图可以显示该程序文件中所有的断点、它们的状态以及位置。在这个视图里,可以通过选择一个或断点,并激活对应断点的程序文本框,来设定、使之无效或是取消断点。
如图 12 所示:
图 12. EPIC 调试跟踪
总结
综上所述,我们已经看到了一个集编辑、编译、调试 Perl 程序为一体的图形化的工具,它解决了若干年来一直困扰着测试工作者的对于 Perl 语言编写自动化脚本‘调试难’的问题。它简洁明了、功能强大的编辑环境也给 Perl 语言编程者带来了世外桃源般得享受。最重要的是获取这一切,您都采取的是免费的方式,因为所有的组件都是开源的,这是一款非常值得推荐的软件工具。
4.2如何用Eclipse调试Perl应用程序
来源:http://www.shangxueba.com/jingyan/88423.html
开始之前
本教程将介绍 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 服务器时返回,其中应包含到脚本的链接
请发表评论