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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木可大大

漫谈Web缓存架构

目前,Web应用的核心数据通常存放在数据库中,比如说用户信息、订单信息、交易信息等,同时,数据库和编程语言是无关的,通过SQL交互,Java、Php等语言写的程...

44410
来自专栏专注 Java 基础分享

弄懂 JRE、JDK、JVM 之间的区别与联系

其实很多 Java 程序员在写了很多代码后,你问他 jre 和 jdk 之间有什么关系,jvm 又是什么东西,很多人不知所云。本篇不会讲述 jvm 底层是如何与...

3714
来自专栏北京马哥教育

实用 Linux 命令行使用技巧集锦

最近在Quora上看到一个问答题目,关于在高效率Linux用户节省时间Tips。将该题目的回答进行学习总结,加上自己的一些经验,记录如下,方便自己和大家参考。 ...

3648
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第二十天 Redis学习【悟空教程】

rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.66.1.13.0.el6.i686

1865
来自专栏木可大大

漫谈Web缓存架构

目前,Web应用的核心数据通常存放在数据库中,比如说用户信息、订单信息、交易信息等,同时,数据库和编程语言是无关的,通过SQL交互,Java、Php等语言写的程...

1203
来自专栏我和PYTHON有个约会

05.第一个Python程序

python作为一种编程语言,通过编写程序的方式来解决问题 python编写的程序,是文本文件,后缀名称为[.py]

982
来自专栏美团技术团队

缓存那些事

前言 一般而言,现在互联网应用(网站或App)的整体流程,可以概括如图1所示,用户请求从界面(浏览器或App界面)到网络转发、应用服务再到存储(数据库或文件系统...

6754
来自专栏有趣的Python

21- vue django restful framework 打造生鲜超市 -首页商品分类显示功能

Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 线上演示地址: http://vueshop.mt...

4109
来自专栏Django中文社区

概述

通常情况下,Django 的视图函数(View)是一个纯粹的 Python 函数,它接收一个 request(HTTP 请求),返回一个 response(HT...

2797
来自专栏Ryan Miao

Git 工作流的正确打开方式

前言 一直在使用git做版本控制,也一直工作很顺利,直到和别人发生冲突的时候。这才注意到git 工作流并不是那么简单。比如,之前遇到的清理历史。百度到的资料很...

3116

扫码关注云+社区

领取腾讯云代金券