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元组操作实例解析
Sep 23 Python
python统计cpu利用率的方法
Jun 02 Python
Python3中使用urllib的方法详解(header,代理,超时,认证,异常处理)
Sep 21 Python
python中lambda()的用法
Nov 16 Python
python复制文件到指定目录的实例
Apr 27 Python
python使用多进程的实例详解
Sep 19 Python
详解Python下Flask-ApScheduler快速指南
Nov 04 Python
python itchat实现调用微信接口的第三方模块方法
Jun 11 Python
python中open函数的基本用法示例
Sep 07 Python
python3连接mysql获取ansible动态inventory脚本
Jan 19 Python
Python内置类型性能分析过程实例
Jan 29 Python
详解Python中string模块除去Str还剩下什么
Nov 30 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
一条久听不愿放下的DIY森海MX500,三言两语话神奇
2021/03/02 无线电
php 运行效率总结(提示程序速度)
2009/11/26 PHP
用来解析.htgroup文件的PHP类
2012/09/05 PHP
PHP也能干大事 随机函数
2015/04/14 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
2019/10/15 PHP
yii2.0框架实现上传excel文件后导入到数据库的方法示例
2020/04/13 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
2008/03/22 Javascript
JavaScript Event学习第六章 事件的访问
2010/02/07 Javascript
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
初窥JQuery-Jquery简介 入门了解篇
2010/11/25 Javascript
javascript将数组插入到另一个数组中的代码
2013/01/10 Javascript
基于JQuery实现的Select级联
2014/01/27 Javascript
微信小程序 触控事件详细介绍
2016/10/17 Javascript
BootStrap tab选项卡使用小结
2020/08/09 Javascript
javascript另类方法实现htmlencode()与htmldecode()函数实例分析
2016/11/17 Javascript
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
使用canvas及js简单生成验证码方法
2017/04/02 Javascript
mpvue中使用flyjs全局拦截的实现代码
2018/09/13 Javascript
微信小程序实现菜单左右联动
2020/05/19 Javascript
js实现飞机大战小游戏
2020/08/26 Javascript
[51:29]Alliance vs TNC 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
Python排序搜索基本算法之选择排序实例分析
2017/12/09 Python
python实现定时提取实时日志程序
2018/06/22 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
opencv python Canny边缘提取实现过程解析
2020/02/03 Python
python的reverse函数翻转结果为None的问题
2020/05/11 Python
DataFrame.groupby()所见的各种用法详解
2020/06/14 Python
python中导入 train_test_split提示错误的解决
2020/06/19 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
美国优质马术服装购买网站:Breeches.com
2019/12/16 全球购物
新手上路标语
2014/06/20 职场文书
在职员工证明书
2014/09/19 职场文书
2014年幼儿园安全工作总结
2014/11/10 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
小学家庭教育心得体会
2016/01/14 职场文书