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数据统计的一些小技巧
Jul 21 Python
Python中__init__.py文件的作用详解
Sep 18 Python
Python实现抢购IPhone手机
Feb 07 Python
Python实现找出数组中第2大数字的方法示例
Mar 26 Python
python集合比较(交集,并集,差集)方法详解
Sep 13 Python
Python产生Gnuplot绘图数据的方法
Nov 09 Python
python 实现敏感词过滤的方法
Jan 21 Python
dataframe 按条件替换某一列中的值方法
Jan 29 Python
Python3 pip3 list 出现 DEPRECATION 警告的解决方法
Feb 16 Python
Python中无限循环需要什么条件
May 27 Python
python交互模式基础知识点学习
Jun 18 Python
使用python tkinter开发一个爬取B站直播弹幕工具的实现代码
Feb 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判断来访是搜索引擎蜘蛛还是普通用户的代码小结
2015/09/14 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
2016/05/07 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
Laravel 微信小程序后端搭建步骤详解
2019/11/26 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
js常用排序实现代码
2010/12/28 Javascript
jQuery EasyUI API 中文文档 - Menu菜单
2011/10/03 Javascript
只需20行代码就可以写出CSS覆盖率测试脚本
2013/04/24 Javascript
JS去除数组重复值的五种不同方法
2013/09/06 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
原生js实现秒表计时器功能
2017/02/16 Javascript
Vue-resource实现ajax请求和跨域请求示例
2017/02/23 Javascript
javascript 跨域问题以及解决办法
2017/07/17 Javascript
用 Vue.js 递归组件实现可折叠的树形菜单(demo)
2017/12/25 Javascript
vue文件树组件使用详解
2018/03/29 Javascript
小程序实现多列选择器
2019/02/15 Javascript
详解JavaScript 的变量
2019/03/08 Javascript
用js限制网页只在微信浏览器中打开(或者只能手机端访问)
2020/12/24 Javascript
JavaScript中clientWidth,offsetWidth,scrollWidth的区别
2021/01/25 Javascript
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
详解Python当中的字符串和编码
2015/04/25 Python
详解Python 切片语法
2019/06/10 Python
CSS3 网页下拉菜单代码解释 中文翻译
2010/02/27 HTML / CSS
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
HTML5重塑Web世界它将如何改变互联网
2012/12/17 HTML / CSS
html5视频媒体标签video的使用方法及完整参数说明详解
2019/09/27 HTML / CSS
高中毕业自我鉴定
2013/12/16 职场文书
中国梦的演讲稿
2014/01/08 职场文书
房屋租赁协议书范本
2014/04/10 职场文书
乳制品整治工作方案
2014/05/29 职场文书
承诺书范文
2014/06/03 职场文书
工作说明书格式
2014/07/29 职场文书
手机被没收的检讨书
2014/10/04 职场文书
餐厅如何利用“营销策略”扭转亏本局面
2019/10/15 职场文书
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle