Python 如何调试程序崩溃错误


Posted in Python onAugust 03, 2020

问题

你的程序崩溃后该怎样去调试它?

解决方案

如果你的程序因为某个异常而崩溃,运行 python3 -i someprogram.py 可执行简单的调试。 -i 选项可让程序结束后打开一个交互式shell。 然后你就能查看环境,例如,假设你有下面的代码:

# sample.py

def func(n):
 return n + 10

func('Hello')

运行 python3 -i sample.py 会有类似如下的输出:

bash % python3 -i sample.py
Traceback (most recent call last):
 File "sample.py", line 6, in <module>
 func('Hello')
 File "sample.py", line 4, in func
 return n + 10
TypeError: Can't convert 'int' object to str implicitly
>>> func(10)
20
>>>

如果你看不到上面这样的,可以在程序崩溃后打开Python的调试器。例如:

>>> import pdb
>>> pdb.pm()
> sample.py(4)func()
-> return n + 10
(Pdb) w
 sample.py(6)<module>()
-> func('Hello')
> sample.py(4)func()
-> return n + 10
(Pdb) print n
'Hello'
(Pdb) q
>>>

如果你的代码所在的环境很难获取交互shell(比如在某个服务器上面), 通常可以捕获异常后自己打印跟踪信息。例如:

import traceback
import sys

try:
 func(arg)
except:
 print('**** AN ERROR OCCURRED ****')
 traceback.print_exc(file=sys.stderr)

要是你的程序没有崩溃,而只是产生了一些你看不懂的结果, 你在感兴趣的地方插入一下 print() 语句也是个不错的选择。 不过,要是你打算这样做,有一些小技巧可以帮助你。 首先,traceback.print_stack() 函数会你程序运行到那个点的时候创建一个跟踪栈。例如:

>>> def sample(n):
...  if n > 0:
...    sample(n-1)
...  else:
...    traceback.print_stack(file=sys.stderr)
...
>>> sample(5)
 File "<stdin>", line 1, in <module>
 File "<stdin>", line 3, in sample
 File "<stdin>", line 3, in sample
 File "<stdin>", line 3, in sample
 File "<stdin>", line 3, in sample
 File "<stdin>", line 3, in sample
 File "<stdin>", line 5, in sample
>>>

另外,你还可以像下面这样使用 pdb.set_trace() 在任何地方手动的启动调试器:

import pdb

def func(arg):
 ...
 pdb.set_trace()
 ...

当程序比较大而你想调试控制流程以及函数参数的时候这个就比较有用了。 例如,一旦调试器开始运行,你就能够使用 print 来观测变量值或敲击某个命令比如 w 来获取追踪信息。

讨论

不要将调试弄的过于复杂化。一些简单的错误只需要观察程序堆栈信息就能知道了, 实际的错误一般是堆栈的最后一行。 你在开发的时候,也可以在你需要调试的地方插入一下 print() 函数来诊断信息(只需要最后发布的时候删除这些打印语句即可)。

调试器的一个常见用法是观测某个已经崩溃的函数中的变量。 知道怎样在函数崩溃后进入调试器是一个很有用的技能。

当你想解剖一个非常复杂的程序,底层的控制逻辑你不是很清楚的时候, 插入 pdb.set_trace() 这样的语句就很有用了。

实际上,程序会一直运行到碰到 set_trace() 语句位置,然后立马进入调试器。 然后你就可以做更多的事了。

如果你使用IDE来做Python开发,通常IDE都会提供自己的调试器来替代pdb。 更多这方面的信息可以参考你使用的IDE手册。

以上就是Python 如何调试程序崩溃错误的详细内容,更多关于Python调试程序崩溃错误的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python登录QQ邮箱发信的实现代码
Feb 10 Python
python实现根据月份和日期得到星座的方法
Mar 27 Python
Python基于二分查找实现求整数平方根的方法
May 12 Python
python魔法方法-属性转换和类的表示详解
Jul 22 Python
Python基于Socket实现的简单聊天程序示例
Aug 05 Python
Django ORM框架的定时任务如何使用详解
Oct 19 Python
Python中交换两个元素的实现方法
Jun 29 Python
Python实现的各种常见分布算法示例
Dec 13 Python
python数字类型math库原理解析
Mar 02 Python
使用SQLAlchemy操作数据库表过程解析
Jun 10 Python
python性能测试工具locust的使用
Dec 28 Python
使用python向MongoDB插入时间字段的操作
May 18 Python
Python 捕获代码中所有异常的方法
Aug 03 #Python
Python连接mysql数据库及简单增删改查操作示例代码
Aug 03 #Python
Python pip使用超时问题解决方案
Aug 03 #Python
python时间序列数据转为timestamp格式的方法
Aug 03 #Python
python3 中使用urllib问题以及urllib详解
Aug 03 #Python
Python txt文件常用读写操作代码实例
Aug 03 #Python
Python连接Mysql进行增删改查的示例代码
Aug 03 #Python
You might like
一篇入门的php Class 文章
2007/04/04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十三)
2014/06/26 PHP
CI框架的安全性分析
2016/05/18 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
详解no input file specified 三种解决方法
2019/11/29 PHP
js 获取中文拼音,Select自动匹配字母获取值的代码
2009/09/23 Javascript
读jQuery之八 包装事件对象
2011/06/21 Javascript
javascript自启动函数的问题探讨
2013/10/05 Javascript
JS随机漂浮广告代码具体实例
2013/11/19 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
AngularJS 使用 UI Router 实现表单向导
2016/01/29 Javascript
深入浅析javascript中的作用域(推荐)
2016/07/19 Javascript
JavaScript数组去重的6个方法
2017/01/21 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
JS面向对象编程实现的拖拽功能案例详解
2020/03/03 Javascript
vue中watch的用法汇总
2020/12/28 Vue.js
Python标准模块--ContextManager上下文管理器的具体用法
2017/11/27 Python
python爬取淘宝商品详情页数据
2018/02/23 Python
Python实现读取SQLServer数据并插入到MongoDB数据库的方法示例
2018/06/09 Python
python实现将一个数组逆序输出的方法
2018/06/25 Python
python 自定义对象的打印方法
2019/01/12 Python
Python中的random.uniform()函数教程与实例解析
2019/03/02 Python
打包python 加icon 去掉cmd黑窗口方法
2019/06/24 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
2020/05/07 Python
Python如何实现爬取B站视频
2020/05/20 Python
Python特殊属性property原理及使用方法解析
2020/10/09 Python
详解Python+Selenium+ChromeDriver的配置和问题解决
2021/01/19 Python
HTML5在手机端实现视频全屏展示方法
2020/11/23 HTML / CSS
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
运动会广播稿500字
2014/01/28 职场文书
《生命 生命》教学反思
2014/04/19 职场文书
公司租房协议书
2014/10/14 职场文书
歌剧魅影观后感
2015/06/05 职场文书
PyTorch的Debug指南
2021/05/07 Python
MySQL的存储函数与存储过程的区别解析
2022/04/08 MySQL
python可视化分析绘制带趋势线的散点图和边缘直方图
2022/06/25 Python