Python使用pdb调试代码的技巧


Posted in Python onMay 03, 2020

Python使用pdb调试代码的技巧

什么是pdb

不知道大家在用Python写代码出现报错时是怎样调试的,从报错提示定位回去一步一步check每一行?如果没有IDE或者命令行写代码时又该怎样快速调试?这时如果使用pdb进行调试将会异常方便。

Pdb就是Python debugger,是python自带的调试器。通过 pdb 我们可以交互式的查看运行过程中变量的值、设置断点、逐行执行代码、查看代码的调用栈等等。并且如果环境没有 GUI 的话,那么 pdb 能够助你更快速的调试代码。

首先我们准备一段有问题的代码用于示例

def test(p):
  p = p + 1
  
  return p

def fastdebug():
  print('start')
  temp = 'ready' 
  print('ok')
  res = test(temp) 
  print('end')
  
fastdebug()

这段代码很简单,当我们执行fastdebug()时,会执行fastdebug函数并在该函数中调用另一个函数test(),test函数接收一个参数p并计算p+1的值传出。很明显,在高亮的一句代码中传进去的参数temp是str,所以当我们执行上面一段代码时一定会报错

Python使用pdb调试代码的技巧

现在让我们假装不知道问题出在哪,使用pdb来调试这段代码。

使用pdb

由于pdb是python标准库因此我们可以直接import 使用

import pdb

接着在我们需要调试的代码段前设一个断点

pdb.set_trace()

应用到我们的代码:point_down:

Python使用pdb调试代码的技巧

可以看到运行代码后,pdb的调试器控制台将从放置set_trace()的位置开始等待我们的命令,并且箭头标记指向pdb接下来要运行的行。那么接下来介绍一些pdb中常用命令

使用n来执行下一行

可以看到此时调试器指向

print('start')

在弹出的文本框中输入n即可执行该行,并且箭头将指向下一行即将执行的代码

Python使用pdb调试代码的技巧

使用ENTER重复上一个命令

现在还没有到报错的位置,我们使用n或者直接回车重复执行上一个命令

Python使用pdb调试代码的技巧

使用p打印变量值

在Pdb中我们可以使用p + 变量名来查看变量值,比如我们查看变量temp的值

Python使用pdb调试代码的技巧

使用l查看上下行代码

在Pdb中我们可以使用l查看当前行上下几行代码

Python使用pdb调试代码的技巧

使用s进入子函数

现在,我们来到出错的这一行,之所以报错就是传进去变量出了问题,因此我们可以在pdb交互行中使用s来进入子函数test()

Python使用pdb调试代码的技巧

使用r执行函数直到结束

在pdb中可以使用r来执行当前运行函数到结束

Python使用pdb调试代码的技巧

使用c停止调试并继续运行

现在我们修改相关代码完成调试,可以使用c命令继续执行命令

Python使用pdb调试代码的技巧

当然也可以输入q直接退出调试界面

以上就是使用Python标准库执行一次debug过程,可以看到pdb在命令行下调试代码是非常出色的,当然在某些情况下pdb将不是最好的选择比如涉及到多线程相关,而在比较大型的项目使用pdb也显得力不从心,因此我们需要灵活选择调试方案,不过至少我们又掌握了一种代码调试工具,不是吗?

Python 相关文章推荐
Zabbix实现微信报警功能
Oct 09 Python
解决Spyder中图片显示太小的问题
Apr 27 Python
对python GUI实现完美进度条的示例详解
Dec 13 Python
Python 3.3实现计算两个日期间隔秒数/天数的方法示例
Jan 07 Python
Python redis操作实例分析【连接、管道、发布和订阅等】
May 16 Python
Python Selenium 之数据驱动测试的实现
Aug 01 Python
django中使用POST方法获取POST数据
Aug 20 Python
Pandas+Matplotlib 箱式图异常值分析示例
Dec 09 Python
解决pycharm安装第三方库失败的问题
May 09 Python
解决python运行启动报错问题
Jun 01 Python
Python StringIO及BytesIO包使用方法解析
Jun 15 Python
Django与AJAX实现网页动态数据显示的示例代码
Feb 24 Python
如何在windows下安装Pycham2020软件(方法步骤详解)
May 03 #Python
Python使用多进程运行含有任意个参数的函数
May 02 #Python
python多进程使用函数封装实例
May 02 #Python
Python中使用filter过滤列表的一个小技巧分享
May 02 #Python
python同时遍历两个list用法说明
May 02 #Python
python多线程实现同时执行两个while循环的操作
May 02 #Python
python 实现两个线程交替执行
May 02 #Python
You might like
利用PHP实现与ASP Banner组件相似的类
2006/10/09 PHP
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
Joomla使用Apache重写模式的方法
2016/05/04 PHP
PHP实现将几张照片拼接到一起的合成图片功能【便于整体打印输出】
2017/11/14 PHP
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
lyhucSelect基于Jquery的Select数据联动插件
2011/03/29 Javascript
获取服务器传来的数据 用JS去空格的正则表达式
2012/03/26 Javascript
原生JavaScript+LESS实现瀑布流
2014/12/12 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
总结jQuery插件开发中的一些要点
2016/05/16 Javascript
怎么引入(调用)一个JS文件
2016/05/26 Javascript
基于jQuery.validate及Bootstrap的tooltip开发气泡样式的表单校验组件思路详解
2016/07/18 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
探索webpack模块及webpack3新特性
2017/09/18 Javascript
jquery中有哪些api jQuery主要API
2017/11/20 jQuery
vscode下的vue文件格式化问题
2018/11/28 Javascript
微信小程序实现搜索指定景点周边美食、酒店
2019/05/18 Javascript
Vue项目中如何使用Axios封装http请求详解
2019/10/23 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
详细解析Python当中的数据类型和变量
2015/04/25 Python
Python实现将16进制字符串转化为ascii字符的方法分析
2017/07/21 Python
pandas通过loc生成新的列方法
2018/11/28 Python
python sqlite的Row对象操作示例
2019/09/11 Python
python opencv实现简易画图板
2020/08/27 Python
Python字符串对齐、删除字符串不需要的内容以及格式化打印字符
2021/01/23 Python
Famous Footwear加拿大:美国多品牌运动休闲鞋店
2018/12/05 全球购物
Nordgreen台湾官网:极简北欧设计手表
2019/08/21 全球购物
微博营销计划书
2014/01/10 职场文书
国际商务专业毕业生自我鉴定2014
2014/09/27 职场文书
学院党委班子四风问题自查报告及整改措施
2014/10/25 职场文书
2014年教师工作总结
2014/11/10 职场文书
捐助倡议书
2015/01/19 职场文书
2015年医院药剂科工作总结
2015/05/04 职场文书
水知道答案观后感
2015/06/08 职场文书
励志语录:只有自己足够强大,才能不被别人践踏
2020/01/09 职场文书