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.csdn.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 pdbpdbhelpexec!

w(here)

打印堆栈跟踪,最近一帧在底部。箭头表示当前帧,它决定了大多数命令的上下文。

d(own)  [count]

移动当前帧计数(默认的)水平在堆栈跟踪下(到较新的帧)。

u(p)  [count]

将当前帧计数(默认的)水平,直至在堆栈跟踪(到旧帧)。

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 ...]]

禁用以空格分隔的断点编号列表给出的断点。禁用断点意​​味着它不会导致程序停止执行,但与清除断点不同,它将保留在断点列表中并可以(重新)启用。

enable  [bpnumber [bpnumber ...]]

启用指定的断点。

ignore  bpnumber [count]

设置给定断点编号的忽略计数。如果省略计数,忽略计数设置为0.当忽略计数为零时,断点变为活动状态。非零时,每次到达断点时都会减少计数,并且不会禁用断点,并且任何关联的条件计算结果为true。

condition  bpnumber [condition]

为断点设置一个新条件,该断点在判断断点前必须评估为true。如果条件不存在,则删除任何现有条件; 即断点是无条件的。

commands  [bpnumber]

指定断点编号bpnumber的命令列表命令本身出现在以下几行。输入一行只是 end为了终止命令。一个例子:


另外,实际上Python的调试器是两个单独的模块。bdb和pdb。

所以也可以在交互模式下使用,比如import bdb或者import pdb。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值