📜  Python调试器Python pdb

📅  最后修改于: 2022-05-13 01:54:50.967000             🧑  作者: Mango

Python调试器Python pdb

Python中的调试由内置于Python标准库中的pdb 模块( Python调试器)提供便利。它实际上被定义为 Pdb 类,它在内部使用 bdb(基本调试器功能)和 cmd(支持面向行的命令解释器)模块。 pdb 的主要优点是它纯粹在命令行中运行,因此当我们没有基于 GUI 的调试器的特权时,它非常适合在远程服务器上调试代码。

pdb 支持-

  • 设置断点
  • 单步执行代码
  • 源代码清单
  • 查看堆栈跟踪

启动Python调试器

有几种方法可以调用调试器

  • 在程序中开始调试,只需插入 import pdb, pdb.set_trace() 命令。正常运行您的脚本,执行将在我们引入断点的地方停止。所以基本上我们在下面我们调用 set_trace() 的行上硬编码一个断点。在Python 3.7 及更高版本中,有一个名为breakpoint()的内置函数以相同的方式工作。请参阅以下示例了解如何插入 set_trace()函数。

示例 1:两个数相加

故意错误: input() 返回字符串程序连接这些字符串而不是添加输入数字

Python3
import pdb
  
  
def addition(a, b):
    answer = a + b
    return answer
  
  
pdb.set_trace()
x = input("Enter first number : ")
y = input("Enter second number : ")
sum = addition(x, y)
print(sum)


Python3
def addition(a, b):
    answer = a + b
    return answer
  
  
x = input("Enter first number : ")
y = input("Enter second number : ")
sum = addition(x, y)
print(sum)


Python3
def multiply(a, b):
    answer = a * b
    return answer
  
  
x = input("Enter first number : ")
y = input("Enter second number : ")
result = multiply(x, y)
print(result)


输出 :

设置跟踪

在尖括号后第一行的输出中,我们有文件的目录路径、断点所在的行号 。这基本上是说我们在模块级别的第 10 行 exppdb.py 中有一个断点。如果在函数内部引入断点,那么它的名称将出现在 <> 中。下一行显示停止执行的代码行。该行尚未执行。然后我们有pdb 提示符。现在要导航代码,我们可以使用以下命令:

CommandFunction
helpTo display all commands
whereDisplay the stack trace and line number of the current line
nextExecute the current line and move to the next line ignoring function calls
stepStep into functions called at the current line

现在要检查变量的类型,只需写下whatis和变量名称。在下面给出的示例中,x 类型的输出作为 返回。因此,在我们的程序中将字符串类型转换为 int 将解决错误。

示例 2:

  • 从命令行:这是使用调试器的最简单方法。您只需要在终端中运行以下命令

此语句加载您的源代码并在第一行代码处停止执行。

示例 3:

蟒蛇3

def addition(a, b):
    answer = a + b
    return answer
  
  
x = input("Enter first number : ")
y = input("Enter second number : ")
sum = addition(x, y)
print(sum)

输出 :

命令行

  • 事后调试是指在程序完成执行过程(已经发生故障)后进入调试模式。 pdb 通过pm()post_mortem()函数支持事后调试。这些函数寻找活动的回溯并启动 调用堆栈中发生异常的行中的调试器。在给定示例的输出中,您可以注意到当程序中遇到异常时会出现 pdb。

示例 4:

蟒蛇3

def multiply(a, b):
    answer = a * b
    return answer
  
  
x = input("Enter first number : ")
y = input("Enter second number : ")
result = multiply(x, y)
print(result)

输出 :

检查堆栈上的变量

所有变量,包括程序中正在执行的函数的局部变量以及全局变量都保存在堆栈中。我们可以使用args (或使用a )来打印当前处于活动状态的函数的所有参数。 p命令计算作为参数给出的表达式并打印结果。

在这里,本文的示例 4 在调试模式下执行,向您展示如何检查变量:

cheking_variable_values

Python pdb 断点

在处理大型程序时,我们经常想在我们知道可能发生错误的地方添加许多断点。要做到这一点,你只需要使用 中断命令。插入断点时,调试器会为其分配一个从 1 开始的编号。使用break可以显示程序中的所有断点。

句法:

下面给出了在用于示例 4 的程序中添加断点的实现。

添加_断点

管理断点

在分配给它们的数字的帮助下添加断点后,我们可以使用 enable 和 disableremove命令。 disable告诉调试器在到达该断点时不要停止,而enable打开禁用的断点。

下面给出了使用示例 4 管理断点的实现。

管理断点