python terminal调试_python执行命令行调试工具pdb
調試
pdb
pdb是基于命令行的調試工具,非常類似gnu的gdb(調試c/c++)。
命令簡寫命令作用
break
b
設置斷點(用法,b :在第數字行設置斷點。.........................................................)
b 直接回車,查看所有斷點
continue
c
直接全部執行完畢----->直到遇到斷點
list
l
查看所有代碼段
step
s
進入函數
return
r
在執行到函數內部時;執行代碼到return完畢
quit
q
中止并退出
next
n
執行下一行
p
打印變量的值
help
h
幫助
args
a
查看當前執行函數 傳入的參數
回車
重復上一條命令
break
b
顯示所有斷點
break lineno
b lineno
在指定行設置斷點
break file:lineno
b file:lineno
在指定文件的行設置斷點
clear num
刪除指定斷點 ,num為斷點的編號
bt
查看函數調用棧幀
執行時調試
程序啟動,停止在第一行等待單步調試。
python -m pdb some.py
交互調試
進入python或ipython解釋器
import pdb
pdb.run('testfun(args)') #此時會打開pdb調試,注意:先使用s跳轉到這個testfun函數中,然后就可以使用l看到代碼了
程序里埋點
當程序執行到pdb.set_trace() 位置時停下來調試
代碼上下文
...
import pdb
pdb.set_trace()
...
日志調試
print大法好
使用pdb調試的5個demo
demo 1
import pdb
a = "aaa"
pdb.set_trace()
b = "bbb"
c = "ccc"
final = a + b + c
print final
#調試方法
# 《1 顯示代碼》
# l---->能夠顯示當前調試過程中的代碼,其實l表示list列出的意思
#如下,途中,-> 指向的地方表示要將要執行的位置
# 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 執行下一行代碼》
# n---->能夠向下執行一行代碼,然后停止運行等待繼續調試 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 將程序繼續運行》
# c----->讓程序繼續向下執行,與n的區別是n只會執行下面的一行代碼,而c會像python xxxx.py一樣 繼續執行不會停止;c表示continue的意思
# 《5 set_trace()》
# 如果程序中有多個set_trace(),那么能夠讓程序在使用c的時候停留在下一個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 設置斷點》
# b---->設置斷點,即當使用c的時候,c可以在遇到set_trace()的時候停止,也可以在遇到標記有斷點的地方停止;b表示break的意思
#例如:
#b 11 在第11行設置斷點,注意這個11可以使用l來得到
# (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 進入函數繼續調試》
# s---->進入函數里面繼續調試,如果使用n表示把一個函數的調用當做一條語句執行過去,而使用s的話,會進入到這個函數 并且停止
#例如
# (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 查看傳遞到函數中的變量》
# a---->調用一個函數時,可以查看傳遞到這個函數中的所有的參數;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 執行到函數的最后一步》
# r----->如果在函數中不想一步步的調試了,只是想到這個函數的最后一條語句那個位置,比如return語句,那么就可以使用r;r表示return的意思
demo 4
In [1]: def pdb_test(arg):
...: for i in range(arg):
...: print(i)
...: return arg
...:
In [2]: #在python交互模式中,如果想要調試這個函數,那么可以
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 運行過程中使用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)
練一練:請使用所學的pdb調試技巧對其進行調試出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 調試有個明顯的缺陷就是對于多線程,遠程調試等支持得不夠好,同時沒有較為直觀的界面顯示,不太適合大型的 python 項目。而在較大的 python 項目中,這些調試需求比較常見,因此需要使用更為高級的調試工具。
總結
以上是生活随笔為你收集整理的python terminal调试_python执行命令行调试工具pdb的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 嵌入式系统实时仿真解决方案SkyEye
- 下一篇: FMI在仿真软件SkyEye中的应用