摘要:簡(jiǎn)單介紹自帶庫(kù),使用調(diào)試程序還是很方便的。比如下圖就是展示斷點(diǎn)進(jìn)入到內(nèi)部之后,打印的參數(shù),打印某個(gè)變量退出調(diào)試,直接退出調(diào)試或者使用的方式退出最后說(shuō)一句上面展示的使用調(diào)試的過程其實(shí)是很簡(jiǎn)單的,文章中主要通過截圖展示運(yùn)行的效果。
簡(jiǎn)單介紹
Python自帶 Pdb庫(kù),使用 Pdb調(diào)試 Python程序還是很方便的。但是遠(yuǎn)程調(diào)試、多線程,Pdb是搞不定的
本文參考的相關(guān)文章如下:
《指針和字符串和字符串常量、用gdb來(lái)獲取非法內(nèi)存中的內(nèi)容》
《Linux gdb調(diào)試器用法全面解析》
《用PDB庫(kù)調(diào)試Python程序》
用Pdb調(diào)試有多種方式使用 Pdb調(diào)試 Python的程序的方式主要是下面的三種!下面逐一介紹
命令行加-m參數(shù)命令行啟動(dòng)目標(biāo)程序,加上-m參數(shù),這樣調(diào)用 testPdb.py的話斷點(diǎn)就是程序執(zhí)行的第一行之前
本文接下來(lái)重點(diǎn)講到的實(shí)例展示就是使用這種方式進(jìn)行調(diào)試的!
python -m pdb testPdb.py在python交互環(huán)境調(diào)試
>>> import pdb >>> import testPdb >>> pdb.run("testPdb.test()")代碼中插入一段程序
比較常用的,就是在程序中間插入一段程序,相對(duì)于在一般 IDE 里面打上斷點(diǎn)然后啟動(dòng) debug,不過這種方式是 hardcode的
if __name__ == "__main__": a = 1 import pdb pdb.set_trace() b = 2 c = a + b print(c)
然后正常運(yùn)行腳本:python testPdb.py 到了 pdb.set_trace()那里就會(huì)定下來(lái),然后就可以看到調(diào)試的提示符 (Pdb)了
針對(duì)上面的這段小程序的調(diào)試情況如下:
準(zhǔn)備測(cè)試程序接下來(lái)使用上面介紹的第一種方式來(lái)調(diào)試 Python程序,以此來(lái)介紹 pdb常用的命令,不過在開始之前先要準(zhǔn)備好測(cè)試的程序代碼:
testFun.py這是一個(gè)會(huì)被主模塊調(diào)用的子模塊,用于測(cè)試使用 Pdb調(diào)試的時(shí)候,是不是可以斷點(diǎn)從主模塊跟蹤進(jìn)入子模塊(后續(xù)有說(shuō)明)
#!/usr/bin/python # -*- coding: utf-8 -*- def add(a, b): return a + btestPdb.py
這是下面被調(diào)試的主模塊的代碼
#!/usr/bin/python # -*- coding: utf-8 -*- def sub(a, b): return a - b if __name__ == "__main__": print "" import testFun i = 0 a = 1 while(i < 100): a = testFun.add(a, 1) i = i + 1 print "累加結(jié)果:", a print "" for letter in "Pdb": print "當(dāng)前字母:", letter print "" fruits = ["banana", "apple", "mango"] for fruit in fruits: print "當(dāng)前水果:", fruit print "" ret = 0 for num in range(10, 12): ret = sub(ret, num) print "循環(huán)結(jié)果:", ret print "" d = {"abc": 123, 123: "abc"} for (k,v) in d.items(): print "當(dāng)前鍵值對(duì):", k, "-", v print ""總結(jié)常用的命令 基礎(chǔ)命令
h(elp)命令:會(huì)打印當(dāng)前版本 Pdb可用的命令,如果要查詢某個(gè)命令,可輸入 h [command] ,例如 h l 查看 list命令
l(ist)命令:可以列出當(dāng)前將要運(yùn)行的代碼塊
斷點(diǎn)管理b(reak):設(shè)置斷點(diǎn)
比如 b 12 就是在當(dāng)前腳本的第 9行加上斷點(diǎn)
比如 b sub 就是在當(dāng)前腳本的 sub函數(shù)定義處加斷點(diǎn)
除了可以在當(dāng)前的腳本中添加斷點(diǎn)之外,還可以在當(dāng)前腳本對(duì)其他腳本下斷點(diǎn),以上面用到的代碼為例 b testFun.add 就可以實(shí)現(xiàn)在 testFun.py腳本中的 add函數(shù)處加斷點(diǎn)
如果只用 b 就會(huì)顯示現(xiàn)有的全部斷點(diǎn)
condition bpnumber [condition]:設(shè)置條件斷點(diǎn),比如 condition 2 a==0 ,就是在第二個(gè)斷點(diǎn)出加條件 “a==0”
cl(ear):刪除斷點(diǎn),如果后面帶有參數(shù),就是清楚指定的斷點(diǎn);如果不帶參數(shù)就是清除所有的斷點(diǎn)
disable/enable:禁用/激活斷點(diǎn)
程序邏輯控制下面展示的幾個(gè)命令,需要知道對(duì)應(yīng)的腳本的代碼和行號(hào),所以這里先截圖展示下面測(cè)試需要用到的前幾行代碼
c(ont(inue)),讓程序正常運(yùn)行,直到遇到下一個(gè)斷點(diǎn)
n(ext),讓程序運(yùn)行下一行,如果當(dāng)前語(yǔ)句有一個(gè)函數(shù)調(diào)用,用n是不會(huì)進(jìn)入被調(diào)用的函數(shù)體中的
下圖中展示的,當(dāng)對(duì)腳本斷點(diǎn)調(diào)試到 testFun.add(a, 1)時(shí),繼續(xù)執(zhí)行n,并不會(huì)進(jìn)入 testFun.add(a, 1)的函數(shù)內(nèi)部
s(tep),跟n相似,但如果當(dāng)前有一個(gè)函數(shù)調(diào)用,那么 s會(huì)進(jìn)入被調(diào)用的函數(shù)體中
下圖中展示的,當(dāng)對(duì)腳本斷點(diǎn)調(diào)試到 testFun.add(a, 1)時(shí),繼續(xù)執(zhí)行s,會(huì)進(jìn)入 testFun.add(a, 1)對(duì)應(yīng)的函數(shù)定義內(nèi)部,雖然 testFun.add不是本腳本中定義的函數(shù)
j(ump),讓程序跳轉(zhuǎn)到指定的行數(shù)
假如當(dāng)前所在行是 10,注意:假如執(zhí)行了 j 20 之后,那么相當(dāng)于程序直接跳到 20行,中間的 11~19行其實(shí)就直接跳過去根本沒有被執(zhí)行到,所以如果這段代碼中有變量的聲明或?qū)ο蟮某跏蓟枰?20行及之后被用到,那么等到用到的時(shí)候就可能導(dǎo)致報(bào)錯(cuò)!
打印重要信息a(rgs),打印當(dāng)前函數(shù)的參數(shù)。比如下圖就是展示斷點(diǎn)進(jìn)入到 testFun.add內(nèi)部之后,打印 testFun.add的參數(shù)
p,打印某個(gè)變量
退出調(diào)試q,直接退出調(diào)試;或者使用 Ctrl+D的方式退出
最后說(shuō)一句上面展示的使用 Pdb調(diào)試的過程其實(shí)是很簡(jiǎn)單的,文章中主要通過截圖展示運(yùn)行的效果。如果單純的看一遍文章,不出意外,會(huì)很沒有頭緒,甚至感覺截圖中的命令、輸出亂七八糟,但是如果親自動(dòng)手跟著走一遍流程,花不了一小時(shí),但是效果絕對(duì)極佳!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/45511.html
摘要:調(diào)試器可幫助程序員分析完整的代碼。我們將使用標(biāo)準(zhǔn)庫(kù)中的模塊調(diào)試我們的腳本。例外是程序執(zhí)行期間發(fā)生的錯(cuò)誤。設(shè)置斷點(diǎn)并檢查堆棧幀,并列出源代碼。輸入以繼續(xù)調(diào)試。分析和計(jì)時(shí)程序分析程序意味著測(cè)量程序的執(zhí)行時(shí)間。的模塊用于分析程序。 showImg(https://segmentfault.com/img/remote/1460000018807029?w=902&h=442); 來(lái)源 | ...
摘要:但是在調(diào)試之后,我們還需要手動(dòng)刪除語(yǔ)句,比較麻煩。關(guān)閉后,語(yǔ)句就不再生效。的好處有很多,一個(gè)是可以制定輸出特定級(jí)別的信息。我們可以用對(duì)進(jìn)行簡(jiǎn)單的配置。小于該的都會(huì)被忽略。但是在處理很長(zhǎng)的代碼的時(shí)候,顯得效率低下。 我們?cè)趯懘a的時(shí)候,往往會(huì)有一大堆錯(cuò)誤。我們?cè)撊绾握{(diào)試呢? 用print語(yǔ)句打印 我們可以用print語(yǔ)句打印我們想要的內(nèi)容,然后在輸出中查看。 print hah 但是在調(diào)...
摘要:通過單元測(cè)試,開發(fā)者可以為構(gòu)成程序的每一個(gè)元素例如,獨(dú)立的函數(shù),方法,類以及模塊編寫一系列獨(dú)立的測(cè)試用例。在每個(gè)測(cè)試中,斷言可以用來(lái)對(duì)不同的條件進(jìn)行檢查。當(dāng)退出調(diào)試器時(shí),調(diào)試器會(huì)自動(dòng)恢復(fù)程序的執(zhí)行。 Python已經(jīng)演化出了一個(gè)廣泛的生態(tài)系統(tǒng),該生態(tài)系統(tǒng)能夠讓Python程序員的生活變得更加簡(jiǎn)單,減少他們重復(fù)造輪的工作。同樣的理念也適用于工具開發(fā)者的工作,即便他們開發(fā)出的工具并沒有出現(xiàn)...
摘要:你可以進(jìn)行如下操作需要注意的是這個(gè)竅門只適用于。在中就不需要進(jìn)行操作了,因?yàn)樗呀?jīng)默認(rèn)進(jìn)行了。這里有幾個(gè)例子可以供你參考譯文出處本文根據(jù)的所譯,整個(gè)譯文帶有我自己的理解與思想,如果譯得不好或有不對(duì)之處還請(qǐng)同行朋友指點(diǎn)。 枚舉 不要這么做: i = 0 for item in iterable: print i, item i += 1 而是這樣: for...
摘要:的被設(shè)定為裝飾器可以幫助我們檢查保證沒有重復(fù)值。錯(cuò)誤記錄等解釋器打印錯(cuò)誤棧的信息,程序也結(jié)束了。將通過配置記錄到日志文件中方便后續(xù)的排查。同理,指定后,和就不起作用了。啟動(dòng)的調(diào)試器,讓程序以單步方式運(yùn)行。 日常的寫在前面 難得的周末,有大段的時(shí)間可以用來(lái)學(xué)習(xí),體驗(yàn)就和工作日的晚上完全不一樣了。好好的沉下心學(xué)習(xí)下~即刻很喜歡了! 好好學(xué)習(xí)的分割線 打打打雞血!!!!!! 面向?qū)ο蟾呒?jí)編程...
閱讀 2307·2021-11-24 09:38
閱讀 2225·2021-11-22 14:44
閱讀 1165·2021-07-29 13:48
閱讀 2626·2019-08-29 13:20
閱讀 1126·2019-08-29 11:08
閱讀 2067·2019-08-26 10:58
閱讀 1271·2019-08-26 10:55
閱讀 3168·2019-08-26 10:39