Perl篇:常用調(diào)試命令
本文所用到的Perl調(diào)試器為Perl解釋器本身,可以通過(guò)-d開關(guān)打開調(diào)試功能。本文不會(huì)將涵蓋所有的調(diào)試命令,只會(huì)解釋一些我們常用的調(diào)試命令,希望對(duì)熱愛(ài)Perl的朋友有所幫助。
打開調(diào)試開關(guān)
Perl是解釋型語(yǔ)言,運(yùn)行一個(gè)Perl腳本,可以通過(guò)在命令行中敲入形如 Perl Test.pl 的命令直接解釋執(zhí)行。如果想調(diào)試我們的腳本程序,可以加上-d選項(xiàng),命令為perl -d Test.pl,回車后程序會(huì)停在DB<1>處,如下圖所示:

從上圖看出程序執(zhí)行到主(main)程序的第二行(Test.pl 2)
插入/查看/刪除斷點(diǎn)
插入斷點(diǎn)可以使用b命令,命令格式為:b 行號(hào)/函數(shù)名 條件,在上圖中DB<1>處即可設(shè)置斷點(diǎn),如下圖所示:

在子過(guò)程SetInitValue處設(shè)置了斷點(diǎn)
查看設(shè)置的斷點(diǎn)使用L命令,注意是大寫,小寫是顯示尚未執(zhí)行到的代碼的部分內(nèi)容,如下圖所示:

斷點(diǎn)設(shè)置在21行處
刪除設(shè)置的斷點(diǎn)請(qǐng)使用B命令,該命令格式為:B 行號(hào)| *,可以指定行號(hào)來(lái)刪除斷點(diǎn)或者使用通配符*來(lái)刪除所有的斷點(diǎn),如下圖所示:

刪除21行處的斷點(diǎn)
增加/查看/刪除監(jiān)視
添加監(jiān)視對(duì)于調(diào)試程序非常重要,本示例腳本中定義了一個(gè)名叫$val的變量,初始值為1,在SetInitValue函數(shù)中修改值為12。通過(guò)對(duì)其添加監(jiān)視,來(lái)理解Perl中怎么增減刪除監(jiān)視的
添加一個(gè)$val==1表達(dá)式的監(jiān)視,命令為w $val==1,如下圖所示:

添加對(duì)表達(dá)式的一個(gè)監(jiān)視
查看當(dāng)前表達(dá)式的值可以使用p命令,格式為p expr,查看$val==1的當(dāng)前表達(dá)式值命令為:p $val==1,如下圖所示:

當(dāng)前表達(dá)式值為1,即true
刪除監(jiān)視可使用W(大寫字母)命令,格式為:W expr|*,可以刪除指定的表達(dá)式或者使用通配符*刪除所有的監(jiān)視值,如下圖所示:

刪除對(duì)表達(dá)式$val==1的監(jiān)視
步入執(zhí)行(Step Into)
步入執(zhí)行即單步調(diào)試中,碰到子過(guò)程會(huì)進(jìn)入子過(guò)程中執(zhí)行,命令為s,如下圖所示:

步入執(zhí)行,進(jìn)入到SetInitValue子過(guò)程中
步出執(zhí)行(Step Out)
步出執(zhí)行及單步調(diào)試中,遇到調(diào)用其他子過(guò)程的時(shí)候,不會(huì)進(jìn)入子過(guò)程中,而是直接執(zhí)行該子過(guò)程的其余行,然后將控制權(quán)返回給子過(guò)程調(diào)用者。示例程序在SetInitValue子過(guò)程中調(diào)用了AddRet子過(guò)程,通過(guò)下圖可以看出其中的區(qū)別:

示例程序部分代碼
調(diào)試程序到SetInitValue子過(guò)程調(diào)用AddRet子過(guò)程處

使用s命令會(huì)步入到AddRet子過(guò)程中

使用n命令直接執(zhí)行完AddRet后返回
跳出執(zhí)行(Return from subroutine)
這個(gè)命令其實(shí)比較有用,在簡(jiǎn)單的程序中或許感覺(jué)不出來(lái)。但是當(dāng)你調(diào)試一個(gè)大型的perl程序的時(shí)候,你會(huì)發(fā)現(xiàn)你所調(diào)試的程序往往引用了很多的其他自定義的或者第三方模塊,并且調(diào)試的程序可能會(huì)頻繁的進(jìn)入這些模塊代碼中,為了節(jié)省時(shí)間與方便,我們更多會(huì)選擇跳出命令選項(xiàng)直接從這個(gè)模塊或者當(dāng)期陷入的子過(guò)程中跳出。
其命令為r,我們?cè)谏鲜隼又衧命令跳入AddRet子過(guò)程的基礎(chǔ)上,使用r命令返回,如下圖所示:

使用r命令從AddRet子過(guò)程直接跳出
退出調(diào)試
退出調(diào)試使用命令q,如下圖所示:
