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模块学习 filecmp 文件比较
Aug 27 Python
通过实例浅析Python对比C语言的编程思想差异
Aug 30 Python
从CentOS安装完成到生成词云python的实例
Dec 01 Python
Python中eval带来的潜在风险代码分析
Dec 11 Python
关于numpy.where()函数 返回值的解释
Dec 06 Python
使用python 的matplotlib 画轨道实例
Jan 19 Python
django实现将后台model对象转换成json对象并传递给前端jquery
Mar 16 Python
关于python 的legend图例,参数使用说明
Apr 17 Python
拿来就用!Python批量合并PDF的示例代码
Aug 10 Python
python实现画图工具
Aug 27 Python
如何基于matlab相机标定导出xml文件
Nov 02 Python
Python实战之实现简易的学生选课系统
May 25 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性能优化注意点
2016/01/04 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
Laravel 5.5 异常处理 &amp; 错误日志的解决
2019/10/17 PHP
各情景下元素宽高的获取实现代码
2011/09/13 Javascript
原生js实现半透明遮罩层效果具体代码
2013/06/06 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
javascript使用appendChild追加节点实例
2015/01/12 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
JavaScript获得页面base标签中url的方法
2015/04/03 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
利用AngularJs实现京东首页轮播图效果
2016/09/08 Javascript
AngularJS入门教程之模块化操作用法示例
2016/11/02 Javascript
jQuery实现给input绑定回车事件的方法
2017/02/09 Javascript
js每隔两秒输出数组中的一项(实例)
2017/05/28 Javascript
nodeJS实现路由功能实例代码
2017/06/08 NodeJs
Vue实现6位数密码效果
2018/08/18 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
vue中通过使用$attrs实现组件之间的数据传递功能
2019/09/01 Javascript
原生js 实现表单验证功能
2021/02/08 Javascript
Python查找相似单词的方法
2015/03/05 Python
python的numpy模块安装不成功简单解决方法总结
2017/12/23 Python
Python视频爬虫实现下载头条视频功能示例
2018/05/07 Python
对python pandas 画移动平均线的方法详解
2018/11/28 Python
Django框架实现的分页demo示例
2019/05/25 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
详解如何用python实现一个简单下载器的服务端和客户端
2019/10/28 Python
django模型类中,null=True,blank=True用法说明
2020/07/09 Python
matplotlib常见函数之plt.rcParams、matshow的使用(坐标轴设置)
2021/01/05 Python
windows系统Tensorflow2.x简单安装记录(图文)
2021/01/18 Python
纯css3实现鼠标经过图片显示描述的动画效果
2014/09/01 HTML / CSS
智利最大的网上商店:Linio智利
2016/11/24 全球购物
小学教师自我鉴定
2013/11/07 职场文书
项目经理的岗位职责
2013/11/23 职场文书
一年级学生评语
2014/04/23 职场文书
幼儿园小班个人工作总结
2015/02/12 职场文书
办公室个人总结
2015/02/28 职场文书