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实现socket端口重定向示例
Feb 10 Python
Mac下Supervisor进程监控管理工具的安装与配置
Dec 16 Python
详解Python中的文本处理
Apr 11 Python
让Python更加充分的使用Sqlite3
Dec 11 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
May 21 Python
Tensorflow中使用tfrecord方式读取数据的方法
Jun 19 Python
Python使用Pickle模块进行数据保存和读取的讲解
Apr 09 Python
详解Python Qt的窗体开发的基本操作
Jul 14 Python
python如何通过twisted搭建socket服务
Feb 03 Python
python GUI库图形界面开发之PyQt5表格控件QTableView详细使用方法与实例
Mar 01 Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 Python
Python实现自动玩连连看的脚本分享
Apr 04 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
apache mysql php 源码编译使用方法
2012/05/03 PHP
php中jQuery插件autocomplate的简单使用笔记
2012/06/14 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
PJBlog插件 防刷新的在线播放器
2006/10/25 Javascript
jquery的index方法实现tab效果
2011/02/16 Javascript
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
javascript 构造函数强制调用经验总结
2012/12/02 Javascript
E3 tree 1.6在Firefox下显示问题的修复方法
2013/01/30 Javascript
如何判断元素是否为HTMLElement元素
2013/12/06 Javascript
jquery-syntax动态语法着色示例代码
2014/05/14 Javascript
jQuery操作元素css样式的三种方法
2014/06/04 Javascript
浅谈EasyUI中编辑treegrid的方法
2015/03/01 Javascript
jQuery 选择同时包含两个class的元素的实现方法
2016/06/01 Javascript
AngularJS入门之动画
2016/07/27 Javascript
Ionic默认的Tabs模板使用实例
2016/08/29 Javascript
jQuery Mobile和HTML5开发App推广注册页
2016/11/07 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
2017/08/16 Javascript
js canvas实现简单的图像扩散效果
2020/06/28 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
浅谈webpack4 图片处理汇总
2018/09/12 Javascript
jQuery实现侧边栏隐藏与显示的方法详解
2018/12/22 jQuery
PostgreSQL Node.js实现函数计算方法示例
2019/02/12 Javascript
js函数和this用法实例分析
2020/03/13 Javascript
python检测某个变量是否有定义的方法
2015/05/20 Python
opencv3/C++实现视频读取、视频写入
2019/12/11 Python
Pytorch之view及view_as使用详解
2019/12/31 Python
linux环境下安装python虚拟环境及注意事项
2020/01/07 Python
浅谈HTML5 FileReader分布读取文件以及其方法简介
2017/11/09 HTML / CSS
简短的公司员工自我评价分享
2013/11/13 职场文书
女大学生自我鉴定
2013/12/09 职场文书
感恩节红领巾广播稿
2014/02/11 职场文书
证劵公司反洗钱宣传活动总结
2015/05/08 职场文书
Python实战之实现简易的学生选课系统
2021/05/25 Python
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS
jdbc中自带MySQL 连接池实践示例
2022/07/23 MySQL
React更新渲染原理深入分析
2022/12/24 Javascript