分类: Python/Ruby
2011-12-13 10:10:18
本文所用到的Perl调试器为Perl解释器本身,可以通过-d开关打开调试功能。本文不会将涵盖所有的调试命令,只会解释一些我们常用的调试 命令,希望对热爱Perl的朋友有所帮助。
打开调试开关
Perl是解释型语言,运行一个Perl脚本,可以通过在命令行中敲入形如 Perl Test.pl 的命令直接解释执行。如果想调试我们的脚本程序,可以加上-d选项,命令为perl -d Test.pl,回车后程序会停在DB<1>处,如下图所示:
从上图看出程序执行到主(main)程序的第二行(Test.pl 2)
插入/查看/删除断点
插入断点可以使用b命令,命令格式为:b 行号/函数名 条件,在上图中DB<1>处即可设置断点,如下图所示:
在子过程SetInitValue处设置了断点
查看设置的断点使用L命令,注意是大写,小写是显示尚未执行到的代码的部分内容, 如下图所示:
断点设置在21行处
删除设置的断点请使用B命令,该命令格式为:B 行号| *,可以指定行号来删除断点或者使用通配符*来删除所有的断点,如下图所示:
删除21行处的断点
增加/查看/删除监视
添加监视对于调试程序非常重要,本示例脚本中定义了一个名叫$val的变量,初始值为1,在SetInitValue函数中修改值为12。通过对其添加监 视,来理解Perl中怎么增减删除监视的
添加一个$val==1表达式的监视,命令为w $val==1,如下图所示:
添加对表达式的一个监视
查看当前表达式的值可以使用p命令,格式为p expr,查看$val==1的当前表达式值命令为:p $val==1,如下图所示:
当前表达式值为1,即true
删除监视可使用W(大写字母)命令,格式为:W expr|*,可以删除指定的表达式或者使用通配符*删除所有的监视值,如下图所示:
删除对表达式$val==1的监视
步入执行(Step Into)
步入执行即单步调试中,碰到子过程会进入子过程中执行,命令为s,如下图所示:
步入执行,进入到SetInitValue子过程中
步出执行(Step Out)
步出执行及单步调试中,遇到调用其他子过程的时候,不会进入子过程中,而是直接执行该子过程的其余行,然后将控制权返回给子过程调用者。 示例程序在SetInitValue子过程中调用了AddRet子过程,通过下图可以看出其中的区别:
示例程序部分代码
调试程序到SetInitValue子过程调用AddRet子过程处
使用s命令会步入到AddRet子过程中
使用n命令直接执行完AddRet后返回
跳出执行(Return from subroutine)
这个命令其实比较有用,在简单的程序中或许感觉不出来。但是当你调试一个大型的perl程序的时候, 你会发现你所调试的程序往往引用了很多的其他自定义的或者第三方模块,并且调试的程序可能会频繁的进入这些模块代码中,为了节省时间与方便,我们更多会选 择跳出命令选项直接从这个模块或者当期陷入的子过程中跳出。
其命令为r,我们在上述例子中s命令跳入AddRet子过程的基础上,使用r命令返回,如下图所示:
使用r命令从AddRet子过程直接跳 出
退出调试
退出调试使用命令q,如下图所示: