前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python | Debugger和pdb,鸡肋否?

Python | Debugger和pdb,鸡肋否?

作者头像
LogicPanda
发布2018-08-30 10:58:54
1.4K0
发布2018-08-30 10:58:54
举报

图文编辑:逻辑熊猫

图片来源:截图

首发平台:CDSN

有读者问我,怎么发现Python的错误以及怎样解决。

我们知道虽然入门级编程语言最好是C和Python,但是C和Python是有这本质的不同的,那就是C语言是编译型语言,而Python是解释型语言。

编译型语言会在编译时报错,而解释型语言确实在解释到某一行时报错。

上面这种属于语法错误,而语法错误之外还要一种语义错误,也就是我们常说的这段代码存在逻辑上的错误。明明没报错,却没有得到预期的结果。

那么针对这两点,个人提供一点建议:

第一、日常犯下的错误,将错误内容和解决方法记录下来,时长回顾。

第二、学会看代码,看方案,看手册,看提示,提高独立解决问题的能力。

第三、放弃代码。

那么当一个项目很大,或者是需要优化的时候,该怎么办?

使用调试器进行调试。

这里简单说一下调试器的问题。在Windows下从Python官方网站下载的解释器,自带调试器

如上图红框,打开Debug->Debugger,相关的帮助文档在Help里,可以使用F1打开文章搜索Debugger

注意:Debugger只能在Python Shell下打开 ,不能再执行程序的时候再打开。如果你有c语言逆向相关的经验的话,应该了解一些。

这里用来调试的示例代码是我之前写过的wnl.py,一个实现万年历功能的小程序。

调试步骤是:打开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]

如果没有参数,请打印可用命令的列表。用命令作为参数,打印关于该命令的帮助。 显示完整的文档(模块的文档字符串)。由于命令 参数必须是标识符,因此必须输入以获取有关该命令的帮助。

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。

功能简介:领域包括了“面向 Python 基础,进阶和有趣应用”的一站式技术分享,挖掘学习者在学习当中遇到的各类问题并分享经验,关注实用技能和有趣新闻,感兴趣的敬请关注。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 逻辑熊猫带你玩Python 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档