本文所用到的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,如所示: