Python中实用的 Python debugger-pdb
- 前言
- pdb介绍
- 实例
- 總結
前言
今天笔记一下刚学一个的实用的Python debugger,个人觉得算是非常实用的,它让你更容易的去除错,甚至还可以在debug的同时,打一些代码来作一些自己想做的测试.以下将透过一些简单的例子来介绍相关指令集的使用.官方文档 : pdb — The Python Debugger
pdb介绍
以下先举一个简单的例子,并将这段代码之档案名称命为pdb_debugger.py
import pdb
def add(a,b):
pass
pdb.set_trace()
c = add(3,5)
上面这个pdb.set_trace()
的意思就是代码执行到这一行的时候会停下来,如果这时候我们到终端机打执行 python3 pdb_debugger.py
此时此刻会在终端机出现:
-> c = add(3,5)
这边需要特别注意到的是,他显示的东西并不是已经执行完这行代码,而是即将执行这行代码, 在上面这行的下方会有一个:
(Pdb)
这个介面就是可以让你输入相关的指令集,有了这个概念后,先简单的列出并叙述一些常用的指令集:
-
l
将被执行该档案之代码陈列出来,具体他会显示多少我没有去研究 -
w
显示下一段将执行的代码,可以帮助了解你现在代码执行到哪了 -
n
即执行的代码,如上述说明终端上显示的(或输入w)会出现即将执行的代码 -
s
这个功能主要针对函式除错使用,下面将进行说明 -
r
将执行完现有的函式 -
b
设置终断点 -
c
持续执行直到下一个终断点,如果没有终断点,则执行到整个代码结束为止.
实例
这边开始由浅入深开始介绍上述的指令集:
1. 指令 s 以及 n的区别:
import pdb
def add(a,b):
c = 0
for i in range(a) :
c+=(i*b)
return c
pdb.set_trace()
c = add(3,5)
執行代碼後 :
(Pdb)
如果输入n : 会直接执行完函式 add(a,b)
**这行代码,也就是说没办法进如函数里面除错.
如果输入s : 会进入该函式 add(a,b)
**,并且等待下一个命令.
2. 指令 r 的介紹:
假设现在我们输入了s
进入了函数后,如果此时输入指令r,
代码会直接一直跑到该函数的末行,这边我个人认为可以理解为在函数的末行设置了一个终段点,也就是这行 :
return c
接着只要输入n那就完成函数的执行了!
3. 指令 c 以及 b
上述简单的解释已提及c
就是持续执行,那么如果我们希望c
到某一段后,就先暂停的话可以怎么做?例如:
def add(a,b):
c = 0
for i in range(a) :
c+=(i*b)
return c
pdb.set_trace()
c = add(3,5)
//
100多行代碼
//
d = add(c,5)
上述这个例子中,如果我们现在确定可能会出现问题的代码在c = add(3,5)
和d = add(c,5)
,中间的100多行代码都是没问题的,那如果使用指令n的话,要按100多下…这边我们可以配合指令c
和指令b
的使用,上述提到指令c
会使其不断执行到下一个终断点为止,要加入一个终断点,那么我们可以使用:
(Pdb) b 15
这边代表在代码的第15行设置另一个终断点,至于怎么知道我们想设的终断点在哪一行,可以透过指令l
指令来查询,查询到相对应的行数后,将其加在b
后面即可.
4 指令 interact
个人觉得最厉害的就是这个功能了,这个功能可以让我们在除错的同时,他给了另一个介面来打让我们敲代码,也就是可以自己做一些小测试.个人觉得这个在写一些张量的操作的时候,这个功能可以很快速的让我们去追踪某一个张量现在的状态:
def add(a,b):
x = np.random.randint(0,100,(4,5))
c = 0
for i in range(a) :
c+=(i*b)
return c
pdb.set_trace()
c = add(3,5)
当我们开始执行代码的时候,首先使用指令s
,进入到add(a,b)
后,紧接着经过两次n
之后,此时已经执行完了 :
x = np.random.randint(0,100,(4,5))
这个时候假设我们想知道x
的一些资讯,我们可以透过指令interact
来操作,此时他会吐一个介面给你,你可以在里面自由发挥,比如可以试试x>3
,他会即时的返回资讯给你,如果想回到除错的介面,执行ctrl+d
即可跳出.
總結
这是一个很棒的工具,上述的东西应该很够可以让你更轻松地除错了,如果有看不懂的地方,这边建议实际去实作看看,应该能马上了解,我也是第一天学,可能有一些东西也没说明正确,如果哪边说错了,大家可以在下方流言指证我!感谢你的阅读.