第24章-Python调试器

python自带一个名为 pdb .这个模块为您的Python程序提供了一个交互式源代码调试器。您可以设置断点、单步执行代码、检查堆栈帧等等。我们将讨论该模块的以下方面:

  • 如何启动调试器

  • 单步执行代码

  • 设置断点

让我们先创建一段快速代码来尝试调试。下面是一个愚蠢的例子:

# debug_test.py

def doubler(a):
    """"""
    result = a*2
    print(result)
    return result

def main():
    """"""
    for i in range(1,10):
        doubler(i)

if __name__ == "__main__":
    main()

现在让我们学习如何针对这段代码运行调试器。

如何启动调试器

可以用三种不同的方法启动调试器。第一种方法是导入并插入 pdb.set_trace() 在代码中启动调试器。您可以在 IDLE 状态下导入调试器,并让它运行您的模块。或者可以在命令行上调用调试器。我们将重点介绍本节最后两种方法。我们将从在解释器中使用它开始( IDLE )。打开终端(命令行窗口),导航到保存上述代码示例的位置。然后启动python。现在执行以下操作:

>>> import debug_test
>>> import pdb
>>> pdb.run('debug_test.main()')
> <string>(1)<module>()
(Pdb) continue
2
4
6
8
10
12
14
16
18
>>>

这里我们导入模块和PDB。然后我们执行PDB run 方法并告诉它调用模块的 main 方法。这将显示调试器的提示。这里我们打字了 持续 告诉它继续运行脚本。你也可以打字 c 作为继续的快捷方式。当你 持续 调试程序将继续执行,直到到达断点或脚本结束。

启动调试器的另一种方法是通过终端会话执行以下命令:

python -m pdb debug_test.py

如果您这样运行,您将看到一个稍有不同的结果:

-> def doubler(a):
(Pdb) c
2
4
6
8
10
12
14
16
18
The program finished and will be restarted

您会注意到在这个示例中我们使用了 c 而不是 持续 .您还将注意到,调试器将在末尾重新启动。这将保留调试器的状态(如断点),并且比停止调试器更有用。有时,您需要对代码进行多次检查,以了解它出了什么问题。

让我们再深入一点,学习如何逐步完成代码。

单步执行代码

如果您想一次一行地浏览代码,那么可以使用 step (或简单的“s”)命令。以下是您的观赏乐趣:

C:\Users\mike>cd c:\py101

c:\py101>python -m pdb debug_test.py
> c:\py101\debug_test.py(4)<module>()
-> def doubler(a):
(Pdb) step
> c:\py101\debug_test.py(11)<module>()
-> def main():
(Pdb) s
> c:\py101\debug_test.py(16)<module>()
-> if __name__ == "__main__":
(Pdb) s
> c:\py101\debug_test.py(17)<module>()
-> main()
(Pdb) s
--Call--
> c:\py101\debug_test.py(11)main()
-> def main():
(Pdb) next
> c:\py101\debug_test.py(13)main()
-> for i in range(1,10):
(Pdb) s
> c:\py101\debug_test.py(14)main()
-> doubler(i)
(Pdb)

在这里,我们启动调试器并告诉它单步执行代码。它从顶部开始,经过前两个函数定义。然后它到达条件并发现它应该执行 main 功能。我们进入主函数,然后使用 next 命令。这个 next 如果命令遇到一个被调用的函数而没有单步执行它,它将执行该函数。如果您想单步执行被调用的函数,那么只需要使用 step 命令。

当你看到一行像 > c:py101debug_test.py(13)main() ,您需要注意括号中的数字。此编号是代码中的当前行号。

你可以使用 args (或) a )将当前参数列表打印到屏幕。另一个方便的命令是 jump (或) j )后跟空格和要“跳转”到的行号。这使您能够跳过一系列单调的步骤,到达您想要到达的行。这让我们了解了断点!

设置断点

断点是代码中要暂停执行的行。可以通过调用 打破 (或) b )命令,后跟空格和要中断的行号。您还可以在行号前面加上文件名和冒号,以在其他文件中指定断点。break命令还允许您使用 功能 参数。还有一个 t制动 命令,它将设置一个临时断点,当它被击中时,该断点将被自动删除。

下面是一个例子:

c:\py101>python -m pdb debug_test.py
> c:\py101\debug_test.py(4)<module>()
-> def doubler(a):
(Pdb) break 6
Breakpoint 1 at c:\py101\debug_test.py:6
(Pdb) c
> c:\py101\debug_test.py(6)doubler()
-> result = a*2

我们启动调试器,然后告诉它在第6行设置一个断点。然后我们继续,它停在6号线,就像它应该停的那样。现在是检查参数列表的好时机,看看它是否是您所期望的。试着打字 args 现在。然后再做一个 持续 还有一个 args 看看它是如何变化的。

总结

在调试器中可以使用许多其他命令。我建议阅读文档以了解其他文档。但是,此时您应该能够有效地使用调试器调试您自己的代码。