python調(diào)試:pdb基本用法(轉(zhuǎn))

轉(zhuǎn)自IBM開發(fā)者社區(qū)簇秒。

使用pdb進行調(diào)試:

pdb 是 python 自帶的一個包鱼喉,為 python 程序提供了一種交互的源代碼調(diào)試功能,主要特性包括設(shè)置斷點趋观、單步調(diào)試扛禽、進入函數(shù)調(diào)試、查看當前代碼皱坛、查看棧片段编曼、動態(tài)改變變量的值等。pdb 提供了一些常用的調(diào)試命令剩辟,詳情見表 1掐场。

  • 表 1. pdb 常用命令
命令 解釋
break 或 b 設(shè)置斷點 設(shè)置斷點
continue 或 c 繼續(xù)執(zhí)行程序
list 或 l 查看當前行的代碼段
step 或 s 進入函數(shù)
return 或 r 執(zhí)行代碼直到從當前函數(shù)返回
exit 或 q 中止并退出
next 或 n 執(zhí)行下一行
pp 打印變量的值
help 幫助

下面結(jié)合具體的實例講述如何使用 pdb 進行調(diào)試往扔。

清單 1. 測試代碼示例

 import pdb 
 a = "aaa"
 pdb.set_trace() 
 b = "bbb"
 c = "ccc"
 final = a + b + c 
 print final

開始調(diào)試:直接運行腳本,會停留在 pdb.set_trace() 處刻肄,選擇 n+enter 可以執(zhí)行當前的 statement瓤球。在第一次按下了 n+enter 之后可以直接按 enter 表示重復執(zhí)行上一條 debug 命令。

清單 2. 利用 pdb 調(diào)試

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = "ccc"
 (Pdb) 
 > /root/epdb1.py(6)?() 
 -> final = a + b + c 
 (Pdb) list 
  1     import pdb 
  2     a = "aaa"
  3     pdb.set_trace() 
  4     b = "bbb"
  5     c = "ccc"
  6  -> final = a + b + c 
  7     print final 
 [EOF] 
 (Pdb) 
 [EOF] 
 (Pdb) n 
 > /root/epdb1.py(7)?() 
 -> print final 
 (Pdb)

退出 debug:使用 quit 或者 q 可以退出當前的 debug敏弃,但是 quit 會以一種非常粗魯?shù)姆绞酵顺龀绦蜇韵郏浣Y(jié)果是直接 crash。

清單 3. 退出 debug

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = "ccc"
 (Pdb) q 
 Traceback (most recent call last): 
  File "epdb1.py", line 5, in ? 
    c = "ccc"
  File "epdb1.py", line 5, in ? 
    c = "ccc"
  File "/usr/lib64/python2.4/bdb.py", line 48, in trace_dispatch 
    return self.dispatch_line(frame) 
  File "/usr/lib64/python2.4/bdb.py", line 67, in dispatch_line 
    if self.quitting: raise BdbQuit 
 bdb.BdbQuit

打印變量的值:如果需要在調(diào)試過程中打印變量的值麦到,可以直接使用 p 加上變量名绿饵,但是需要注意的是打印僅僅在當前的 statement 已經(jīng)被執(zhí)行了之后才能看到具體的值,否則會報 NameError: < exceptions.NameError … ....> 錯誤瓶颠。

清單 4. debug 過程中打印變量

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = "ccc"
 (Pdb) p b 
'bbb'
 (Pdb) 
'bbb'
 (Pdb) n 
 > /root/epdb1.py(6)?() 
 -> final = a + b + c 
 (Pdb) p c 
'ccc'
 (Pdb) p final 
 *** NameError: <exceptions.NameError instance at 0x1551b710 > 
 (Pdb) n 
 > /root/epdb1.py(7)?() 
 -> print final 
 (Pdb) p final 
'aaabbbccc'
 (Pdb)

使用 c 可以停止當前的 debug 使程序繼續(xù)執(zhí)行拟赊。如果在下面的程序中繼續(xù)有 set_statement() 的申明,則又會重新進入到 debug 的狀態(tài)粹淋,讀者可以在代碼 print final 之前再加上 set_trace() 驗證吸祟。

清單 5. 停止 debug 繼續(xù)執(zhí)行程序

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb1.py(5)?() 
 -> c = "ccc"
 (Pdb) c 
 aaabbbccc

顯示代碼:在 debug 的時候不一定能記住當前的代碼塊,如要要查看具體的代碼塊桃移,則可以通過使用 list 或者 l 命令顯示屋匕。list 會用箭頭 -> 指向當前 debug 的語句。

清單 6. debug 過程中顯示代碼

[root@rcc-pok-idg-2255 ~]#  python epdb1.py 
 > /root/epdb1.py(4)?() 
 -> b = "bbb"
 (Pdb) list 
  1     import pdb 
  2     a = "aaa"
  3     pdb.set_trace() 
  4  -> b = "bbb"
  5     c = "ccc"
  6     final = a + b + c 
  7     pdb.set_trace() 
  8     print final 
 [EOF] 
 (Pdb) c 
 > /root/epdb1.py(8)?() 
 -> print final 
 (Pdb) list 
  3     pdb.set_trace() 
  4     b = "bbb"
  5     c = "ccc"
  6     final = a + b + c 
  7     pdb.set_trace() 
  8  -> print final 
 [EOF] 
 (Pdb)

在使用函數(shù)的情況下進行 debug

清單 7. 使用函數(shù)的例子

import pdb 
 def combine(s1,s2):      # define subroutine combine, which... 
    s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, ... 
    s3 = '"' + s3 +'"'   # encloses it in double quotes,... 
    return s3            # and returns it. 
 a = "aaa"
 pdb.set_trace() 
 b = "bbb"
 c = "ccc"
 final = combine(a,b) 
 print final

如果直接使用 n 進行 debug 則到 final=combine(a,b) 這句的時候會將其當做普通的賦值語句處理借杰,進入到 print final过吻。如果想要對函數(shù)進行 debug 如何處理呢 ? 可以直接使用 s 進入函數(shù)塊。函數(shù)里面的單步調(diào)試與上面的介紹類似蔗衡。如果不想在函數(shù)里單步調(diào)試可以在斷點處直接按 r 退出到調(diào)用的地方纤虽。

對函數(shù)進行 debug

[root@rcc-pok-idg-2255 ~]# python epdb2.py 
 > /root/epdb2.py(10)?() 
 -> b = "bbb"
 (Pdb) n 
 > /root/epdb2.py(11)?() 
 -> c = "ccc"
 (Pdb) n 
 > /root/epdb2.py(12)?() 
 -> final = combine(a,b) 
 (Pdb) s 
 --Call-- 
 > /root/epdb2.py(3)combine() 
 -> def combine(s1,s2):      # define subroutine combine, which... 
 (Pdb) n 
 > /root/epdb2.py(4)combine() 
 -> s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, ... 
 (Pdb) list 
  1     import pdb 
  2 
  3     def combine(s1,s2):      # define subroutine combine, which... 
  4  ->     s3 = s1 + s2 + s1    # sandwiches s2 between copies of s1, ... 
  5         s3 = '"' + s3 +'"'   # encloses it in double quotes,... 
  6         return s3            # and returns it. 
  7 
  8     a = "aaa"
  9     pdb.set_trace() 
 10     b = "bbb"
 11     c = "ccc"
 (Pdb) n 
 > /root/epdb2.py(5)combine() 
 -> s3 = '"' + s3 +'"'   # encloses it in double quotes,... 
 (Pdb) n 
 > /root/epdb2.py(6)combine() 
 -> return s3            # and returns it. 
 (Pdb) n 
 --Return-- 
 > /root/epdb2.py(6)combine()->'"aaabbbaaa"'
 -> return s3            # and returns it. 
 (Pdb) n 
 > /root/epdb2.py(13)?() 
 -> print final 
 (Pdb)

在調(diào)試的時候動態(tài)改變值 。在調(diào)試的時候可以動態(tài)改變變量的值绞惦,具體如下實例逼纸。需要注意的是下面有個錯誤,原因是 b 已經(jīng)被賦值了济蝉,如果想重新改變 b 的賦值樊展,則應(yīng)該使用! B堆生。

清單 9. 在調(diào)試的時候動態(tài)改變值

[root@rcc-pok-idg-2255 ~]# python epdb2.py 
 > /root/epdb2.py(10)?() 
 -> b = "bbb"
 (Pdb) var = "1234"
 (Pdb) b = "avfe"
 *** The specified object '= "avfe"' is not a function 
 or was not found along sys.path. 
 (Pdb) !b="afdfd"
 (Pdb)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市雷酪,隨后出現(xiàn)的幾起案子淑仆,更是在濱河造成了極大的恐慌,老刑警劉巖哥力,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔗怠,死亡現(xiàn)場離奇詭異墩弯,居然都是意外死亡,警方通過查閱死者的電腦和手機寞射,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門渔工,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人桥温,你說我怎么就攤上這事引矩。” “怎么了侵浸?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵旺韭,是天一觀的道長。 經(jīng)常有香客問我掏觉,道長区端,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任澳腹,我火速辦了婚禮织盼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘酱塔。我一直安慰自己沥邻,他們只是感情好,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布延旧。 她就那樣靜靜地躺著谋国,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迁沫。 梳的紋絲不亂的頭發(fā)上芦瘾,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音集畅,去河邊找鬼近弟。 笑死,一個胖子當著我的面吹牛挺智,可吹牛的內(nèi)容都是我干的祷愉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赦颇,長吁一口氣:“原來是場噩夢啊……” “哼二鳄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起媒怯,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤订讼,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扇苞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體欺殿,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡寄纵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了脖苏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片程拭。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖棍潘,靈堂內(nèi)的尸體忽然破棺而出恃鞋,到底是詐尸還是另有隱情,我是刑警寧澤蜒谤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布山宾,位于F島的核電站,受9級特大地震影響鳍徽,放射性物質(zhì)發(fā)生泄漏资锰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一阶祭、第九天 我趴在偏房一處隱蔽的房頂上張望绷杜。 院中可真熱鬧,春花似錦濒募、人聲如沸鞭盟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽齿诉。三九已至,卻和暖如春晌姚,著一層夾襖步出監(jiān)牢的瞬間粤剧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工挥唠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留抵恋,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓宝磨,卻偏偏與公主長得像弧关,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子唤锉,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容