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中的Numeric包和Numarray包使用教程
Apr 13 Python
深入理解python中的浅拷贝和深拷贝
May 30 Python
python如何查看系统网络流量的信息
Sep 12 Python
浅谈python import引入不同路径下的模块
Jul 11 Python
PyQt 线程类 QThread使用详解
Jul 16 Python
python多维数组切片方法
Apr 13 Python
python实现汉诺塔算法
Mar 01 Python
python随机在一张图像上截取任意大小图片的方法
Jan 24 Python
python将字典列表导出为Excel文件的方法
Sep 02 Python
python中open函数的基本用法示例
Sep 07 Python
pytorch 彩色图像转灰度图像实例
Jan 13 Python
Python3 多线程(连接池)操作MySQL插入数据
Jun 09 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
教你如何把一篇文章按要求分段
2006/10/09 PHP
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
ThinkPHP CURD方法之page方法详解
2014/06/18 PHP
ASP.NET中基于JQUERY的高性能的TreeView补充
2011/02/23 Javascript
为JavaScript类型增加方法的实现代码(增加功能)
2011/12/29 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
TinyMCE汉化及本地上传图片功能实例详解
2016/05/31 Javascript
使用微信小程序开发前端【快速入门】
2016/12/05 Javascript
Linux系统中利用node.js提取Word(doc/docx)及PDF文本的内容
2017/06/17 Javascript
Node.js中 __dirname 的使用介绍
2017/06/19 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
浅谈Vue Element中Select下拉框选取值的问题
2018/03/01 Javascript
Redux实现组合计数器的示例代码
2018/07/04 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
Node.js原生api搭建web服务器的方法步骤
2019/02/15 Javascript
教你完全理解ReentrantLock重入锁
2019/06/03 Javascript
vue+elementUI动态增加表单项并添加验证的代码详解
2020/12/17 Vue.js
Python字符串处理之count()方法的使用
2015/05/18 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
2017/12/20 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
使用python对文件中的数值进行累加的实例
2018/11/28 Python
对django中foreignkey的简单使用详解
2019/07/28 Python
python opencv实现简易画图板
2020/08/27 Python
python time()的实例用法
2020/11/03 Python
删除pycharm鼠标右键快捷键打开项目的操作
2021/01/16 Python
美国畅销的跑步机品牌:ProForm
2017/02/06 全球购物
马来西亚最大的在线隐形眼镜商店:MrLens
2019/03/27 全球购物
delegate与普通函数的区别
2014/01/22 面试题
What's the difference between deep copy and shallow copy? (深拷贝与浅拷贝有什么区别)
2015/11/10 面试题
几个MySql的面试题
2013/04/22 面试题
中学生期末评语
2014/02/03 职场文书
民族团结先进个人事迹材料
2014/06/02 职场文书
员工保密协议书
2014/09/27 职场文书
2015年学校办公室工作总结
2015/05/26 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书