专栏首页逻辑熊猫带你玩PythonPython | Debugger和pdb,鸡肋否?

Python | Debugger和pdb,鸡肋否?

图文编辑:逻辑熊猫

图片来源:截图

首发平台: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 基础,进阶和有趣应用”的一站式技术分享,挖掘学习者在学习当中遇到的各类问题并分享经验,关注实用技能和有趣新闻,感兴趣的敬请关注。

本文分享自微信公众号 - 逻辑熊猫带你玩Python(LogicPanda),作者:逻辑熊猫

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-05-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Python | “当包管理器不能帮你安装pip时怎么办?”

    小编最近更新演示环境,安装开发环境的时候发现这样一个问题,那就是Ubuntu Server 18.04LTS以及Ubuntu Server 16.04LTS版本...

    LogicPanda
  • “推荐给新手的几个编程酷站,最后一个最骚包!”

    gitHub是一个面向开源及私有软件项目的托管平台,因为只支持git 作为唯一的版本库格式进行托管,故名gitHub。

    LogicPanda
  • Python | “简易清单(EasyBill)增强版”

    前情提要:关于本软件的前生今世可以查看笔者的历史文章《Python | “一个简单的清单软件easybill”》

    LogicPanda
  • 在 Chrome DevTools 中调试 JavaScript

    由浅入深说一说怎么样在 Chrome DevTools 中调试 JavaScript。

    从入门到进错门
  • JavaScript指定断点操作

    做前端开发的小伙伴,或许对这个断点操作不是很熟悉。不过你要是问其他语言(比如C,C++ ,C #等)的开发者,他们应该都挺熟悉断点操作,这种断点操作在诸如XCo...

    用户3158888
  • chrome调试工具常用功能整理

    chrome devtools 中 Elements panel 是审查 dom 元素和 css 的, 可以实时修改 dom/css.

    bear_fish
  • 快速找到message toast弹出的application代码位置

    re-launch application,在application code里弹出message toast的位置,断点会自动触发

    Jerry Wang
  • 【译】Chrome77 Devtools有哪些新功能?

    我们可以在打开开发者工具后,鼠标右击某个dom树中的节点,选择Copy -> Copy Styles即可将dom元素的样式复制到剪贴板中。

    腾讯IVWEB团队
  • Google Tag Manager实战指南——跟踪用户复制行为

    不少网站会在页面上留下联系方式,希望访客通过联系方式与您取得联系,如微信或邮箱,这次分享的是GTM中的复制行为,主要是用户复制页面上的联系方式,具体的如图3-1...

    GA小站
  • python中的热更新或动态加载

    遍览网络中关于动态加载模块的文章,发现有两种方法,一种是用守护进程的方法,一种是用python自带的reload函数。

    py3study

扫码关注云+社区

领取腾讯云代金券