回覆列表
  • 1 # rlpuf2288

      本文章講述瞭如何用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)中執行敘述。  轉載

  • 2 # pzyyo24296

    Debug 對於是一項非常重要的功能,它能夠幫助我們準確的定位錯誤,發現程式中的 bug。python 提供了一系列 debug 的工具和包,可供我們選擇。pdb 是 python 自帶的一個包,為 python 程式提供了一種互動的原始碼除錯功能,主要特性包括

  • 中秋節和大豐收的關聯?
  • 手機ip地址可以修改嗎?