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进阶教程之函数对象(函数也是对象)
Aug 30 Python
Python基于socket实现简单的即时通讯功能示例
Jan 16 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
Mar 05 Python
解决Python 中英文混输格式对齐的问题
Jul 16 Python
利用python打开摄像头及颜色检测方法
Aug 03 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 Python
利用matplotlib为图片上添加触发事件进行交互
Apr 23 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
Aug 02 Python
pyqt5实现井字棋的示例代码
Dec 07 Python
Django程序的优化技巧
Apr 29 Python
Python爬虫:从m3u8文件里提取小视频的正确操作
May 14 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
《被神捡到的男人》动画化计划进行中!
2020/03/06 日漫
ucenter通信原理分析
2015/01/09 PHP
php根据用户语言跳转相应网页
2015/11/04 PHP
使用php完成常见的文件上传功能(推荐)
2017/01/13 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
php和nginx交互实例讲解
2019/09/24 PHP
laravel 查询数据库获取结果实现判断是否为空
2019/10/24 PHP
Jquery创建一个层当鼠标移动到层上面不消失效果
2013/12/12 Javascript
js的2种继承方式详解
2014/03/04 Javascript
用js模拟struts2的多action调用示例
2014/05/19 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
JavaScript给每一个li节点绑定点击事件的实现方法
2016/12/01 Javascript
JS跨域请求外部服务器的资源
2017/02/06 Javascript
Vue.js通用应用框架-Nuxt.js的上手教程
2017/12/25 Javascript
用p5.js制作烟花特效的示例代码
2018/03/21 Javascript
在vue中安装使用vux的教程详解
2018/09/16 Javascript
JavaScript如何实现元素全排列实例代码
2019/05/14 Javascript
Vue Object 的变化侦测实现代码
2020/04/15 Javascript
[07:54]DOTA2 MV《我的动力鞋》 ImbaTV 出品
2014/11/21 DOTA
深入讨论Python函数的参数的默认值所引发的问题的原因
2015/03/30 Python
Python标准库之itertools库的使用方法
2017/09/07 Python
python批量导入数据进Elasticsearch的实例
2018/05/30 Python
Flask框架配置与调试操作示例
2018/07/23 Python
Python正则匹配判断手机号是否合法的方法
2020/12/09 Python
Python学习笔记之字符串和字符串方法实例详解
2019/08/22 Python
jupyter notebook清除输出方式
2020/04/10 Python
两种CSS3伪类选择器详细介绍
2013/12/24 HTML / CSS
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
味多美官网:蛋糕订购,100%使用天然奶油
2017/11/10 全球购物
生物技术专业研究生自荐信
2013/09/22 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
人力资源管理专业求职信
2014/07/23 职场文书
音乐教育专业自荐信
2014/09/18 职场文书
前台文员岗位职责
2015/02/04 职场文书
php中pcntl_fork详解
2021/04/01 PHP