上海锐翌生物科技有限公司

服务电话:021-51001612

邮箱:support@realbio.cn

技术课堂

关于debug,Perl命令行调试器了解一下
发布时间:2018-04-26 15:51   点击率:
相信每个程序猿都有过编程5分钟,查问题N小时的经历,也许你觉得通过打印日志可以查到问题,但是这样一方面日志会对代码有侵入,一方面当日志量较大,比如需要跟进循环内部时,很难排查出有问题的是哪条。今天就和大家一起讨论下Perl语言里该怎么debug来快速定位问题。

1. What’s debug
大家都知道bug在程序编程中是“错误”的意思,那么debug就是通过调试,发现并减少程序错误的一个过程。
2. The way to Debug
每种语言debug的方式细节可能不太相同,但大体思路一致。有些语言需要依靠相应的IDE环境去debug,有些语言会自带debug命令,比如Perl。Perl语言有自带的调试器,功能也很全面。因为我们一般使用Perl开发程序时多是通过命令行界面登录服务器,所以,今天这里主要介绍一下缺省命令行调试器方法。
3. How to debug
那就看示例代码吧:
文件名是test.pl,主功能很简单,申明了一个数组,并定义了一个子函数,在子函数中我们对数组进行了修改。


接下来,我们通过Perl自带的调试工具看下如何一步步观察变量的变化。
首先,在命令行中输入perl -d test.pl。
-d即Perl语言的debug指令,这样我们就进入了debug模式,控制台从上到下依次会输出当前Perl版本;提示输入h可以查看指定帮助;当前代码光标所在的行数、代码;以及提示输入指令。


图中输入h后可以看到各指定功能的简介。或者输入h+空格+指令,查看具体指令参数。

然后,通常情况下因为添加断点需要指定行数,所以我们需要先查看下代码整体,使用l指令:

可以看到第3行的”==>”表示当前代码执行到的位置,我们可以通过s指令,让代码一行一行的执行下去。从第3行起始位置开始执行一次s指令,会让代码执行到第4行,再执行一次s指令,按照程序执行的顺序,执行到第7行的子函数内部。

继续s执行到第8行,我们可以使用”p变量”或者”x 变量”查看执行到这一步,各变量的值。

因为我们是通过址引用传递的数组,所以参数接收的是数组的地址,使用”n”命令继续向下运行,同时可以在此过程中观察各变量的值。(n命令和s命令都是执行下一步,不同的是n命令不会进入到子函数中,而是直接跳出子函数,s命令会进入到子函数调试中,如果已经在子函数内部了,n命令还是可以一行一行往下运行的)。

最后,当程序全部执行完后,控制台会提示debug结束,我们可以使用q退出或者R重新debug。

截止到目前我们是一步步的在调试代码,如果我们大概知道出问题的地方,比如这里是循环出现了问题,我们可以直接在循环内部打断点:使用b命令可以在指定行上增加断点,断点的意思是:当程序执行到断点时会停止掉,等待下一步命令。这里我们在第9行上添加断点后,使用c命令(代表执行,没有断点会直接执行到程序结束),可以看到程序直接在第一次循环的地方停止了。

此外如果我们想要监视一个全局变量值的变化,可以使用w命令,它会在指定变量变化时停止运行,并将此次变化前后的值打印出来,当然,如果需要的话,可以同时监视多个变量的变化。w命令是根据设置的变量名去跟踪变化的,也就是说我们在主函数里定义了一个变量a,子函数里也有个变量a,当这两个变量任意一个的值发生变化时,都会被命中,终止运行。


最后,同学们看黑板,划重点啦。
我们总结下经常会用到的一些命令:
1. h 帮助;
2. n 下一步next,会跳过sub子函数;
3. s 单步调试,可以进入sub子函数;r跳出子函数调试;
4. p 打印表达式的结果,也可以显示变量的值,比如p $a;
5. w 监视表达式;
6. x 显示变量结果;比p支持的数据类型更多;
7. a 行号 命令:给程序的某一行加一个附加操作。在执行该行语句前先执行附加的操作。 A:删除所有已安装的附加操作;
8. c 行号:continue到指定行;
9. b 行号;断点设置。B 行号;断点去除。L;查看断点;
10. q 退出。


锐翌原创文章,未经授权严禁转载。