第24章-调试器
自带一个名为pdb的模块, 此模块能为您的程序供给一个交互式的源代码调试器, 您能够设置断点, 可以单步执行代码, 还能检查堆栈帧等, 我们会探讨该模块的以下一些方面:
让我们先创建一段快速代码来尝试调试。下面是一个愚蠢的例子:
# 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.()来启动调试器, 您能够于 IDLE 状态的时候进行调试器的导入, 进而让其运行您的模块, 又或者能够在命令行之上调用调试器, 我们会着重讲述本节最后的两种方式, 我们会起始于在解释器之中运用它(IDLE), 开启终端(命令行窗口), 朝着保存上述代码示例的地方进行导航, 接着启动, 此刻执行如下操作:
>>> import debug_test >>> import pdb >>> pdb.run('debug_test.main()') > (1)() (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:.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
开启使得调试得以进行的工具, 接着告知其于第六行之处设定一个断点。而后持续推进, 它于六号线路停下, 恰似其理应停止那般。此刻是对参数列表予以查验的适宜时段, 用以查看其是否为你所预期的。尝试键入字词args眼下。接着再开展一项持续行进的操作还进行一次args查看其会怎样发生改变的。
总结
别的大量命令于调试器里是能够运用的, 我提议去阅读文档以便知晓别的文档, 然而, 此刻您理应能够借助调试器切实地调试自身的代码。