python terminal调试_python执行命令行调试工具pdb
調(diào)試
pdb
pdb是基于命令行的調(diào)試工具,非常類似gnu的gdb(調(diào)試c/c++)。
命令簡(jiǎn)寫(xiě)命令作用
break
b
設(shè)置斷點(diǎn)(用法,b :在第數(shù)字行設(shè)置斷點(diǎn)。.........................................................)
b 直接回車(chē),查看所有斷點(diǎn)
continue
c
直接全部執(zhí)行完畢----->直到遇到斷點(diǎn)
list
l
查看所有代碼段
step
s
進(jìn)入函數(shù)
return
r
在執(zhí)行到函數(shù)內(nèi)部時(shí);執(zhí)行代碼到return完畢
quit
q
中止并退出
next
n
執(zhí)行下一行
p
打印變量的值
help
h
幫助
args
a
查看當(dāng)前執(zhí)行函數(shù) 傳入的參數(shù)
回車(chē)
重復(fù)上一條命令
break
b
顯示所有斷點(diǎn)
break lineno
b lineno
在指定行設(shè)置斷點(diǎn)
break file:lineno
b file:lineno
在指定文件的行設(shè)置斷點(diǎn)
clear num
刪除指定斷點(diǎn) ,num為斷點(diǎn)的編號(hào)
bt
查看函數(shù)調(diào)用棧幀
執(zhí)行時(shí)調(diào)試
程序啟動(dòng),停止在第一行等待單步調(diào)試。
python -m pdb some.py
交互調(diào)試
進(jìn)入python或ipython解釋器
import pdb
pdb.run('testfun(args)') #此時(shí)會(huì)打開(kāi)pdb調(diào)試,注意:先使用s跳轉(zhuǎn)到這個(gè)testfun函數(shù)中,然后就可以使用l看到代碼了
程序里埋點(diǎn)
當(dāng)程序執(zhí)行到pdb.set_trace() 位置時(shí)停下來(lái)調(diào)試
代碼上下文
...
import pdb
pdb.set_trace()
...
日志調(diào)試
print大法好
使用pdb調(diào)試的5個(gè)demo
demo 1
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print final
#調(diào)試方法
# 《1 顯示代碼》
# l---->能夠顯示當(dāng)前調(diào)試過(guò)程中的代碼,其實(shí)l表示list列出的意思
#如下,途中,-> 指向的地方表示要將要執(zhí)行的位置
# 2 a = "aaa"
# 3 pdb.set_trace()
# 4 b = "bbb"
# 5 c = "ccc"
# 6 pdb.set_trace()
# 7 -> final = a + b + c
# 8 print final
# 《2 執(zhí)行下一行代碼》
# n---->能夠向下執(zhí)行一行代碼,然后停止運(yùn)行等待繼續(xù)調(diào)試 n表示next的意思
# 《3 查看變量的值》
# p---->能夠查看變量的值,p表示prit打印輸出的意思
#例如:
# p name 表示查看變量name的值
demo 2
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
pdb.set_trace()
final = a + b + c
print final
# 《4 將程序繼續(xù)運(yùn)行》
# c----->讓程序繼續(xù)向下執(zhí)行,與n的區(qū)別是n只會(huì)執(zhí)行下面的一行代碼,而c會(huì)像python xxxx.py一樣 繼續(xù)執(zhí)行不會(huì)停止;c表示continue的意思
# 《5 set_trace()》
# 如果程序中有多個(gè)set_trace(),那么能夠讓程序在使用c的時(shí)候停留在下一個(gè)set_trace()位置處
demo 3
#coding=utf-8
import pdb
def combine(s1,s2):
s3 = s1 + s2 + s1
s3 = '"' + s3 +'"'
return s3
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = combine(a,b)
print final
# 《6 設(shè)置斷點(diǎn)》
# b---->設(shè)置斷點(diǎn),即當(dāng)使用c的時(shí)候,c可以在遇到set_trace()的時(shí)候停止,也可以在遇到標(biāo)記有斷點(diǎn)的地方停止;b表示break的意思
#例如:
#b 11 在第11行設(shè)置斷點(diǎn),注意這個(gè)11可以使用l來(lái)得到
# (Pdb) l
# 4 s3 = s1 + s2 + s1
# 5 s3 = '"' + s3 +'"'
# 6 return s3
# 7 a = "aaa"
# 8 pdb.set_trace()
# 9 -> b = "bbb"
# 10 c = "ccc"
# 11 final = combine(a,b)
# 12 print final
# [EOF]
# (Pdb) b 11
# Breakpoint 1 at /Users/wangmingdong/Desktop/test3.py:11
# (Pdb) c
# > /Users/wangmingdong/Desktop/test3.py(11)()
# -> final = combine(a,b)
# (Pdb) l
# 6 return s3
# 7 a = "aaa"
# 8 pdb.set_trace()
# 9 b = "bbb"
# 10 c = "ccc"
# 11 B-> final = combine(a,b)
# 12 print final
# 《7 進(jìn)入函數(shù)繼續(xù)調(diào)試》
# s---->進(jìn)入函數(shù)里面繼續(xù)調(diào)試,如果使用n表示把一個(gè)函數(shù)的調(diào)用當(dāng)做一條語(yǔ)句執(zhí)行過(guò)去,而使用s的話,會(huì)進(jìn)入到這個(gè)函數(shù) 并且停止
#例如
# (Pdb) l
# 6 return s3
# 7 a = "aaa"
# 8 pdb.set_trace()
# 9 b = "bbb"
# 10 c = "ccc"
# 11 B-> final = combine(a,b)
# 12 print final
# [EOF]
# (Pdb) s
# --Call--
# > /Users/wangmingdong/Desktop/test3.py(3)combine()
# -> def combine(s1,s2):
# (Pdb) l
# 1 import pdb
# 2
# 3 -> def combine(s1,s2):
# 4 s3 = s1 + s2 + s1
# 5 s3 = '"' + s3 +'"'
# 6 return s3
# 7 a = "aaa"
# 8 pdb.set_trace()
# 9 b = "bbb"
# 10 c = "ccc"
# 11 B final = combine(a,b)
# (Pdb)
# 《8 查看傳遞到函數(shù)中的變量》
# a---->調(diào)用一個(gè)函數(shù)時(shí),可以查看傳遞到這個(gè)函數(shù)中的所有的參數(shù);a表示arg的意思
#例如:
# (Pdb) l
# 1 #coding=utf-8
# 2 import pdb
# 3
# 4 -> def combine(s1,s2):
# 5 s3 = s1 + s2 + s1
# 6 s3 = '"' + s3 +'"'
# 7 return s3
# 8
# 9 a = "aaa"
# 10 pdb.set_trace()
# 11 b = "bbb"
# (Pdb) a
# s1 = aaa
# s2 = bbb
# 《9 執(zhí)行到函數(shù)的最后一步》
# r----->如果在函數(shù)中不想一步步的調(diào)試了,只是想到這個(gè)函數(shù)的最后一條語(yǔ)句那個(gè)位置,比如return語(yǔ)句,那么就可以使用r;r表示return的意思
demo 4
In [1]: def pdb_test(arg):
...: for i in range(arg):
...: print(i)
...: return arg
...:
In [2]: #在python交互模式中,如果想要調(diào)試這個(gè)函數(shù),那么可以
In [3]: #采用,pdb.run的方式,如下:
In [4]: import pdb
In [5]: pdb.run("pdb_test(10)")
> (1)()
(Pdb) s
--Call--
> (1)pdb_test()
-> def pdb_test(arg):
(Pdb) l
1 -> def pdb_test(arg):
2 for i in range(arg):
3 print(i)
4 return arg
[EOF]
(Pdb) n
> (2)pdb_test()
-> for i in range(arg):
(Pdb) l
1 def pdb_test(arg):
2 -> for i in range(arg):
3 print(i)
4 return arg
[EOF]
(Pdb) n
> (3)pdb_test()
-> print(i)
(Pdb)
0
> (2)pdb_test()
-> for i in range(arg):
(Pdb)
> (3)pdb_test()
-> print(i)
(Pdb)
1
> (2)pdb_test()
-> for i in range(arg):
(Pdb)
demo 5 運(yùn)行過(guò)程中使用pdb修改變量的值
In [7]: pdb.run("pdb_test(1)")
> (1)()
(Pdb) s
--Call--
> (1)pdb_test()
-> def pdb_test(arg):
(Pdb) a
arg = 1
(Pdb) l
1 -> def pdb_test(arg):
2 for i in range(arg):
3 print(i)
4 return arg
[EOF]
(Pdb) !arg = 100 #!!!這里是修改變量的方法
(Pdb) n
> (2)pdb_test()
-> for i in range(arg):
(Pdb) l
1 def pdb_test(arg):
2 -> for i in range(arg):
3 print(i)
4 return arg
[EOF]
(Pdb) p arg
100
(Pdb)
練一練:請(qǐng)使用所學(xué)的pdb調(diào)試技巧對(duì)其進(jìn)行調(diào)試出bug
#coding=utf-8
import pdb
def add3Nums(a1,a2,a3):
result = a1+a2+a3
return result
def get3NumsAvarage(s1,s2):
s3 = s1 + s2 + s1
result = 0
result = add3Nums(s1,s2,s3)/3
if __name__ == '__main__':
a = 11
# pdb.set_trace()
b = 12
final = get3NumsAvarage(a,b)
print final
pdb 調(diào)試有個(gè)明顯的缺陷就是對(duì)于多線程,遠(yuǎn)程調(diào)試等支持得不夠好,同時(shí)沒(méi)有較為直觀的界面顯示,不太適合大型的 python 項(xiàng)目。而在較大的 python 項(xiàng)目中,這些調(diào)試需求比較常見(jiàn),因此需要使用更為高級(jí)的調(diào)試工具。
總結(jié)
以上是生活随笔為你收集整理的python terminal调试_python执行命令行调试工具pdb的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 嵌入式系统实时仿真解决方案SkyEye
- 下一篇: FMI在仿真软件SkyEye中的应用