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实现的简单算术游戏实例
May 26 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
python读取二进制mnist实例详解
May 31 Python
python登录WeChat 实现自动回复实例详解
May 28 Python
python里dict变成list实例方法
Jun 26 Python
基于pytorch的lstm参数使用详解
Jan 14 Python
Python基于yield遍历多个可迭代对象
Mar 12 Python
python求解汉诺塔游戏
Jul 09 Python
解决python运行效率不高的问题
Jul 20 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 Python
浅谈Python数学建模之固定费用问题
Jun 23 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 和 MySQL 基础教程(一)
2006/10/09 PHP
怎样在php中使用PDF文档功能
2006/10/09 PHP
PHP简介
2006/10/09 PHP
Yii2 加载css、js 载静态资源的方法
2017/03/10 PHP
php实现解析xml并生成sql语句的方法
2018/02/03 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
屏蔽鼠标右键、Ctrl+n、shift+F10、F5刷新、退格键 的javascript代码
2007/04/01 Javascript
模仿JQuery sortable效果 代码有错但值得看看
2009/11/05 Javascript
浅谈JavaScript之事件绑定
2013/07/08 Javascript
js AppendChild与insertBefore用法详细对比
2013/12/16 Javascript
js的hasownproperty使用示例
2014/03/02 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
jquery+php实现滚动的数字特效
2015/11/29 Javascript
基于BootStrap与jQuery.validate实现表单提交校验功能
2016/12/22 Javascript
js防刷新的倒计时代码 js倒计时代码
2017/09/06 Javascript
css和js实现弹出登录居中界面完整代码
2017/11/26 Javascript
详解Vue.js使用Swiper.js在iOS
2018/09/10 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
构建Vue大型应用的10个最佳实践(小结)
2019/11/07 Javascript
微信小程序基于movable-view实现滑动删除效果
2020/01/08 Javascript
JS实现放烟花效果
2020/03/10 Javascript
Vue js with语句原理及用法解析
2020/09/03 Javascript
Django如何实现内容缓存示例详解
2017/09/24 Python
Python 从列表中取值和取索引的方法
2018/12/25 Python
Python 3 使用Pillow生成漂亮的分形树图片
2019/12/24 Python
python 中的[:-1]和[::-1]的具体使用
2020/02/13 Python
浅谈Python中的异常和JSON读写数据的实现
2020/02/27 Python
PyQt5如何将.ui文件转换为.py文件的实例代码
2020/05/26 Python
Python实现冒泡排序算法的完整实例
2020/11/04 Python
HTML5 Canvas如何实现纹理填充与描边(Fill And Stroke)
2013/07/15 HTML / CSS
林清轩官方网站:山茶花润肤油开创者
2016/10/26 全球购物
三严三实对照检查材料范文
2014/09/23 职场文书
学校少先队工作总结
2015/08/12 职场文书
小学中队长竞选稿
2015/11/20 职场文书
2016年员工年度考核评语
2015/12/02 职场文书
幼儿园小班教学反思
2016/03/03 职场文书