如何用pdb進行python調試?
本文章講述了如何用Pdb進行python調試講解. 當手邊 沒有IDE,面對著python調試犯愁時,你就可以參考下本文;(pdb 命令調試) 和 (pdb)help 用pdb進行python調試,用法基本和gdb差不多, 先看一個簡單的例子: epdb1.py .# epdb1.py -- experiment with the Python debugger, pdb a = "aaa" b = "bbb" c = "ccc" final = a + b + c print final 比如要對這個程序進行調試: 1:在文件前面加上這一句,引入調試的模塊。 import pdb 2:在要開始調試的一行加上pdb.set_trace()文件變成: # epdb1.py -- experiment with the Python debugger, pdb import pdb a = "aaa" pdb.set_trace() b = "bbb" c = "ccc" final = a + b + c print final 可以運行這個程序,到斷點出會停下來,和gdb類似, 可以執行命令: 直接回車是重復前一條命令! p(print) 查看一個變量值 n(next) 下一步 s(step) 單步,可進入函數 c(continue)繼續前進 l(list)看源代碼 用pdb調試有多種方式可選: 1.命令行啟動目標程序,加上-m參數,這樣調用myscript.py的話斷點就是程序的執行第一行之前 python -m pdb myscript.py 2. 在Python交互環境中啟用調試 >>> import pdb >>> import mymodule >>> pdb.run('mymodule.test()') 3.比較常用的,就是在程序中間插入一段程序,相對于在一般IDE里面打上斷點然后啟動debug,不過這種方式是hardcode的 if __name__ == "__main__" : a = 1 importpdb pdb .set_trace() b = 2 c = a + b print( c) 然后正常運行腳本,到了pdb.set_trace()那就會定下來,就可以看到調試的提示符(Pdb)了 常用的調試命令 h(elp),會打印當前版本Pdb可用的命令,如果要查詢某個命令,可以輸入 h [command],例如:"h l" - 查看list命令 l(ist),可以列出當前將要運行的代碼塊 (Pdb) l 497 pdb.set_trace() 498 base_data = {} 499 new_data = {} 500 try: 501 execfile(base_file_name,{},base_data) 502 -> execfile(new_file_name,{},new_data) 503 except: 504 logger.writeLog("error! load result log error!") 505 print "load cmp logs error!" 506 raise Exception, "load cmp logs error!" 507>斷點設置 (Pdb)b10 #斷點設置在本py的第10行 或(Pdb)bots.py:20 #斷點設置到 ots.py第20行 刪除斷點(Pdb)b #查看斷點編號 (Pdb)cl 2 #刪除第2個斷點 >運行 (Pdb)n #單步運行 (Pdb)s #細點運行 也就是會下到,方法 (Pdb)c #跳到下個斷點 >查看 (Pdb)p param #查看當前 變量值 (Pdb)l #查看運行到某處代碼 (Pdb)a #查看全部棧內變量 b(reak), 設置斷點,例如 "b 77″,就是在當前腳本的77行打上斷點,還能輸入函數名作為參數,斷點就打到具體的函數入口,如果只敲b,會顯示現有的全部斷點 (Pdb) b 504 Breakpoint 4 at /home/jchen/regression/regressionLogCMP.py:504 condition bpnumber [condition],設置條件斷點,下面語句就是對第4個斷點加上條件"a==3" (Pdb) condition 4 a==3 (Pdb) b Num Type Disp Enb Where 4 breakpoint keep yes at /home/jchen/regression/regressionLogCMP.py:504 stop only if a==3 cl(ear),如果后面帶有參數,就是清除指定的斷點(我在Python2.4上從來沒成功過!!!);如果不帶參數就是清除所有的斷點 (Pdb) cl Clear all breaks? y disable/enable,禁用/激活斷點 (Pdb) disable 3 (Pdb) b Num Type Disp Enb Where 3 breakpoint keep no at /home/jchen/regression/regressionLogCMP.py:505 n(ext),讓程序運行下一行,如果當前語句有一個函數調用,用n是不會進入被調用的函數體中的 s(tep),跟n相似,但是如果當前有一個函數調用,那么s會進入被調用的函數體中 c(ont(inue)),讓程序正常運行,直到遇到斷點 j(ump),讓程序跳轉到指定的行數 (Pdb) j 497 > /home/jchen/regression/regressionLogCMP.py(497)com pareLog() -> pdb.set_trace() a(rgs),打印當前函數的參數 (Pdb) a _logger = _base = ./base/MRM-8137.log _new = ./new/MRM-8137.log _caseid = 5550001 _toStepNum = 10 _cmpMap = {'_bcmpbinarylog': 'True', '_bcmpLog': 'True', '_bcmpresp': 'True'} p,最有用的命令之一,打印某個變量 (Pdb) p _new u'./new/MRM-8137.log' !,感嘆號后面跟著語句,可以直接改變某個變量 q(uit),退出調試 ============================================================================================== 在python中使用pdb模塊可以進行調試 import pdb pdb.set_trace() 也可以使用python -m pdb mysqcript.py這樣的方式 (Pdb) 會自動停在第一行,等待調試,這時你可以看看 幫助 (Pdb) h 說明下這幾個關鍵 命令 >斷點設置 (Pdb)b 10 #斷點設置在本py的第10行 或(Pdb)b ots.py:20 #斷點設置到 ots.py第20行 刪除斷點(Pdb)b #查看斷點編號 (Pdb)cl 2 #刪除第2個斷點 >運行 (Pdb)n #單步運行 (Pdb)s #細點運行 也就是會下到,方法 (Pdb)c #跳到下個斷點 >查看 (Pdb)p param #查看當前 變量值 (Pdb)l #查看運行到某處代碼 (Pdb)a #查看全部棧內變量 (Pdb)w 列出目前call stack 中的所在層。 (Pdb)d 在call stack中往下移一層 (Pdb)u 在call stack中往上移一層。如果在上移一層之后按下 n ,則會在上移之后的一層執行下一個敘述,之前的 function call 就自動返回。 (Pdb)cl 清除指定的斷點。如果沒有帶參數,則清除所有斷點。 (Pdb)disable 取消所有斷點的功能,但仍然保留這些斷點。 (Pdb)enable 恢復斷點的功能。 (Pdb)ignore 設定斷點的忽略次數。如果沒指定 count,其初始 為 0。當 count 為 0 時,斷點會正常動作。若有指定 count,則每次執行到該中斷, count 就少 1,直到 count 數為 0。 (Pdb)condition bpnumber [condition] (Pdb)j(ump) lineNo. 跳到某行執行。只有在 call stack 的最底部才能作用。 (Pdb)l 列出目前所在檔案中的位置。連續地 l 命令會一直列到檔案結尾,可以使用指定行數或范圍來打印。 (Pdb)pp 和 p 命令類似,但是使用 pprint module(沒用過 pprint,詳情請參考 Python Library Reference)。 (Pdb)alias 以一個"別名"代替"一群除錯命令",有點類似 c/c 的 macro(詳情請參考 Python Library Reference)。 (Pdb)unalias 取消某個 alias。 (Pdb)[!]statement 在目前的環境(context)中執行敘述。 轉載