在本章中,我们将学习如何调试线程应用程序。我们还将学习调试的重要性。
什么是调试?
在计算机编程中,调试是从计算机程序中查找和消除错误、错误和异常的过程。这个过程从编写代码开始,并在代码与其他编程单元组合形成软件产品时在连续的阶段中继续。调试是软件测试过程的一部分,是整个软件开发生命周期不可或缺的一部分。
Python 调试器
Python 调试器或 pdb 是 Python 标准库的一部分。它是一个很好的后备工具,用于跟踪难以发现的 bug,并允许我们快速可靠地修复错误代码。以下是 pdp 调试器的两个最重要的任务 -
- 允许我们在运行时检查变量的值。
- 我们也可以单步调试代码并设置断点。
我们可以通过以下两种方式使用 pdb -
- 通过命令行;这也称为事后调试。
- 通过以交互方式运行 pdb.
使用 pdb
要使用 Python 调试器,我们需要在要进入调试器的位置使用以下代码 -
请考虑使用以下命令通过命令行使用 pdb。
- h(help)
- d(down)
- u(up)
- b(break)
- cl(clear)
- l(list))
- n(next))
- c(continue)
- s(step)
- r(return))
- b(break)
以下是 Python 调试器的 h(help) 命令的演示 -
例
在使用 Python 调试器时,我们可以使用以下行在脚本中的任意位置设置断点 -
设置断点后,我们就可以正常运行脚本了。脚本将执行到某个点;直到设置了一条线。考虑以下示例,我们将在脚本中的不同位置使用上述行来运行脚本 -
当上面的脚本运行时,它会执行程序直到 a = “aaa”,我们可以在下面的输出中检查这一点。
--Return--
> <ipython-input-7-8a7d1b5cc854>(3)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
*** NameError: name 'b' is not defined
(Pdb) p c
*** NameError: name 'c' is not defined
> <ipython-input-7-8a7d1b5cc854>(3)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
*** NameError: name 'b' is not defined
(Pdb) p c
*** NameError: name 'c' is not defined
在 pdb 中使用命令 'p(print)' 后,此脚本仅打印 'aaa'。这之后会出现错误,因为我们将断点设置为 a = “aaa”。
同样,我们可以通过更改断点来运行脚本并查看输出中的差异 -
输出
--Return--
> <ipython-input-9-a59ef5caf723>(5)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
'bbb'
(Pdb) p c
'ccc'
(Pdb) p final
*** NameError: name 'final' is not defined
(Pdb) exit
> <ipython-input-9-a59ef5caf723>(5)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
'bbb'
(Pdb) p c
'ccc'
(Pdb) p final
*** NameError: name 'final' is not defined
(Pdb) exit
在下面的脚本中,我们在程序的最后一行中设置断点 -
输出如下 -
--Return--
> <ipython-input-11-8019b029997d>(6)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
'bbb'
(Pdb) p c
'ccc'
(Pdb) p final
'aaabbbccc'
(Pdb)
> <ipython-input-11-8019b029997d>(6)<module>()->None
-> pdb.set_trace()
(Pdb) p a
'aaa'
(Pdb) p b
'bbb'
(Pdb) p c
'ccc'
(Pdb) p final
'aaabbbccc'
(Pdb)