Python | Debugger和pdb那点事
有读者问我,怎么发现Python的错误以及怎样解决。
我们知道虽然入门级编程语言最好是C和Python,但是C和Python是有这本质的不同的,那就是C语言是编译型语言,而Python是解释型语言。
编译型语言会在编译时报错,而解释型语言确实在解释到某一行时报错。
上面这种属于语法错误,而语法错误之外还要一种语义错误,也就是我们常说的这段代码存在逻辑上的错误。明明没报错,却没有得到预期的结果。
那么针对这两点,个人提供一点建议:
第一、日常犯下的错误,将错误内容和解决方法记录下来,时长回顾。
第二、学会看代码,看方案,看手册,看提示,提高独立解决问题的能力。
第三、放弃代码。
那么当一个项目很大,或者是需要优化的时候,该怎么办?
使用调试器进行调试。
这里简单说一下调试器的问题。在Windows下从Python官方网站下载的解释器,自带调试器
如上图红框,打开Debug->Debugger,相关的帮助文档在Help里,可以使用F1打开文章搜索Debugger
注意:Debugger只能在Python Shell下打开 ,不能再执行程序的时候再打开。如果你有c语言逆向相关的经验的话,应该了解一些。
这里用来调试的示例代码是我之前写过的wnl.py,一个实现万年历功能的小程序。
案例代码在下面链接:https://blog.****.net/dcnxkpguoa/article/details/80301080
调试步骤是:打开Debugger->代开wnl.py->执行代码
可以看到如下画面
第一个红框,里面是可以执行的功能:
Go:会直接执行程序;
Step:可以直接步进执行;
Quit:退出Debugger。
第二个红框是执行到的代码行。
第三个红框是程序在该行时的状态。
上面是Windows下的一些内容,接下来是Linux上的一些内容。
Linux使用pdb进行调试。
关于pdb,如果你使用的是py2,直接在命令行输入pdb xxx.py,如果你使用的是py3,那么此处应为pdb3 xxx.py。
关于这一点,python、python3、pydoc、pydoc3、pip、pip3,存在一个共性。
有木有很像Debugger?
一贯的命令行模式。学会使用help。
接下来是一个标准风格的手册:
另外附上手册页:https://docs.python.org/3/library/pdb.html#debugger-commands
-
h(elp)
[command]
如果没有参数,请打印可用命令的列表。用命令作为参数,打印关于该命令的帮助。 显示完整的文档(模块的文档字符串)。由于命令 参数必须是标识符,因此必须输入以获取有关该命令的帮助。
help pdb
pdb
helpexec
!
-
b(reak)
[([filename:]lineno | function) [, condition]]
-
使用lineno参数,在当前文件中设置一个中断。使用 函数参数,在该函数中的第一个可执行语句处设置一个中断。行号可以用文件名和冒号作为前缀,以指定另一个文件中的断点(可能是尚未加载的文件)。该文件被搜索
sys.path
。请注意,每个断点都分配了一个其他所有断点命令引用的数字。如果存在第二个参数,那么它是一个表达式,它必须在断点被赋予之前评估为true。
如果没有参数,请列出所有中断,包括每个断点,断点已被命中的次数,当前忽略计数以及相关条件(如果有)。
-
tbreak
[([filename:]lineno | function) [, condition]]
临时断点,在首次命中时会自动删除。参数与之相同
break
。
-
cl(ear)
[filename:lineno | bpnumber [bpnumber ...]]
使用文件名:lineno参数,清除此行的所有断点。用空格分隔的断点数列表清除这些断点。没有参数,清除所有的中断(但首先要求确认)。
-
disable
[bpnumber [bpnumber ...]]
禁用以空格分隔的断点编号列表给出的断点。禁用断点意味着它不会导致程序停止执行,但与清除断点不同,它将保留在断点列表中并可以(重新)启用。
-
ignore
bpnumber [count]
设置给定断点编号的忽略计数。如果省略计数,忽略计数设置为0.当忽略计数为零时,断点变为活动状态。非零时,每次到达断点时都会减少计数,并且不会禁用断点,并且任何关联的条件计算结果为true。
另外,实际上Python的调试器是两个单独的模块。bdb和pdb。
所以也可以在交互模式下使用,比如import bdb或者import pdb。