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使用MySQLdb访问mysql数据库的方法
Aug 03 Python
python内置函数:lambda、map、filter简单介绍
Nov 16 Python
Python基于TCP实现会聊天的小机器人功能示例
Apr 09 Python
Python使用分布式锁的代码演示示例
Jul 30 Python
使用python对文件中的数值进行累加的实例
Nov 28 Python
pycharm修改界面主题颜色的方法
Jan 17 Python
Python标准库使用OrderedDict类的实例讲解
Feb 14 Python
在python 中split()使用多符号分割的例子
Jul 15 Python
Python的in,is和id函数代码实例
Apr 18 Python
pycharm2020.2 配置使用的方法详解
Sep 16 Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 Python
基于Python的EasyGUI学习实践
May 07 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定时执行任务的3种方法详解
2015/12/21 PHP
php基于数组函数实现关联表的编辑操作示例
2017/07/04 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
JQuery Tips(4) 一些关于提高JQuery性能的Tips
2009/12/19 Javascript
一个简单的js鼠标划过切换效果
2010/06/30 Javascript
js定时器怎么写?就是在特定时间执行某段程序
2013/10/11 Javascript
js判断60秒以及倒计时示例代码
2014/01/24 Javascript
JS中的Replace方法使用经验分享
2015/05/20 Javascript
JavaScript中eval函数的问题
2016/01/31 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
2016/06/03 Javascript
JavaScript使用ZeroClipboard操作剪切板
2017/05/10 Javascript
webpack进阶——缓存与独立打包的用法
2017/08/02 Javascript
详解小程序不同页面之间通讯的解决方案
2018/11/23 Javascript
three.js搭建室内场景教程
2018/12/30 Javascript
puppeteer实现html截图的示例代码
2019/01/10 Javascript
详解Vue template 如何支持多个根结点
2020/02/10 Javascript
vue 判断页面是首次进入还是再次刷新的实例
2020/11/05 Javascript
python获取网页中所有图片并筛选指定分辨率的方法
2018/03/31 Python
django 数据库连接模块解析及简单长连接改造方法
2019/08/29 Python
如何基于Python制作有道翻译小工具
2019/12/16 Python
Python字典中的值为列表或字典的构造实例
2019/12/16 Python
Python类成员继承重写的实现
2020/09/16 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
德国电子商城:ComputerUniverse
2017/04/21 全球购物
国际商务专业学生个人的自我评价
2013/09/28 职场文书
毕业生教师求职信
2013/10/20 职场文书
中专毕业生的自我鉴定
2013/12/01 职场文书
行政总经理岗位职责
2013/12/05 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
宣传普通话标语
2014/06/27 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
学校少先队工作总结
2015/08/12 职场文书
安全学习心得体会范文
2016/01/18 职场文书
Java使用jmeter进行压力测试
2021/07/09 Java/Android
聊聊SpringBoot自动装配的魔力
2021/11/17 Java/Android
游戏《我的世界》澄清Xbox版暂无计划加入光追
2022/04/03 其他游戏