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中operator模块的操作符使用示例总结
Jun 28 Python
Python温度转换实例分析
Jan 17 Python
如何利用Anaconda配置简单的Python环境
Jun 24 Python
django将网络中的图片,保存成model中的ImageField的实例
Aug 07 Python
python 调试冷知识(小结)
Nov 11 Python
python 实现二维字典的键值合并等函数
Dec 06 Python
Python多重继承之菱形继承的实例详解
Feb 12 Python
Python如何批量获取文件夹的大小并保存
Mar 31 Python
python如何写出表白程序
Jun 01 Python
Java爬虫技术框架之Heritrix框架详解
Jul 22 Python
python利用蒙版抠图(使用PIL.Image和cv2)输出透明背景图
Aug 04 Python
python中doctest库实例用法
Dec 31 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随机字符串生成代码(包括大小写字母)
2013/06/24 PHP
PHP魔术方法的使用示例
2015/06/23 PHP
php可扩展的验证类实例(可对邮件、手机号、URL等验证)
2015/07/09 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
PHP常用函数之格式化时间操作示例
2019/10/21 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
javascript中的数字与字符串相加实例分析
2011/08/14 Javascript
jquery表单验证使用插件formValidator
2012/11/10 Javascript
JavaScript中的单引号和双引号报错的解决方法
2014/09/01 Javascript
node.js开机自启动脚本文件
2014/12/24 Javascript
JavaScript保存并运算页面中数字类型变量的写法
2015/07/06 Javascript
Javascript实现的SHA-256加密算法完整实例
2016/02/02 Javascript
ES6概念 Symbol.keyFor()方法
2016/12/25 Javascript
浅谈Vuejs Prop基本用法
2017/08/17 Javascript
Ionic学习日记实现验证码倒计时
2018/02/08 Javascript
一种angular的方法级的缓存注解(装饰器)
2018/03/13 Javascript
React事件处理的机制及原理
2018/12/03 Javascript
js canvas实现橡皮擦效果
2018/12/20 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
Node.js + express实现上传大文件的方法分析【图片、文本文件】
2019/03/14 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
如何进行微信公众号开发的本地调试的方法
2019/06/16 Javascript
[40:55]Liquid vs LGD 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
python人人网登录应用实例
2014/09/26 Python
Python多线程编程(二):启动线程的两种方法
2015/04/05 Python
Python3实现并发检验代理池地址的方法
2016/09/18 Python
Python过滤序列元素的方法
2020/07/31 Python
python利用appium实现手机APP自动化的示例
2021/01/26 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
C语言面试题
2013/05/19 面试题
超市重阳节活动方案
2014/02/10 职场文书
党委领导班子整改方案
2014/09/30 职场文书
幼儿园教师自我评价
2015/03/04 职场文书
2015年国庆节活动总结
2015/03/23 职场文书
javascript实现计算器功能详解流程
2021/11/01 Javascript