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中使用glob和rmtree删除目录子目录及所有文件的例子
Nov 21 Python
python黑魔法之参数传递
Feb 12 Python
python列表的常用操作方法小结
May 21 Python
python使用mysql数据库示例代码
May 21 Python
Python队列的定义与使用方法示例
Jun 24 Python
python 创建弹出式菜单的实现代码
Jul 11 Python
python实现自动登录
Sep 17 Python
pycharm设置鼠标悬停查看方法设置
Jul 29 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
Oct 09 Python
keras中的卷积层&amp;池化层的用法
May 22 Python
python文件操作seek()偏移量,读取指正到指定位置操作
Jul 05 Python
Python爬虫中Selenium实现文件上传
Dec 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
提示Trying to clone an uncloneable object of class Imagic的解决
2011/10/27 PHP
PHP 之Section与Cookie使用总结
2012/09/14 PHP
phpmyadmin下载、安装、配置教程
2017/05/16 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
laravel高级的Join语法详解以及使用Join多个条件
2019/10/16 PHP
Javascript中的Split使用方法与技巧
2007/03/09 Javascript
javascript之卸载鼠标事件的代码
2007/05/14 Javascript
常用Extjs工具:Extjs.util.Format使用方法
2012/03/22 Javascript
Javascript面向对象扩展库代码分享
2012/03/27 Javascript
JQuery 在线引用及测试引用是否成功
2014/06/24 Javascript
浏览器中url存储的JavaScript实现
2015/07/07 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
jQuery设置Easyui校验规则(推荐)
2016/11/21 Javascript
神级程序员JavaScript300行代码搞定汉字转拼音
2017/05/20 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
react实现一个优雅的图片占位模块组件详解
2017/10/30 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
vue组件定义,全局、局部组件,配合模板及动态组件功能示例
2019/03/19 Javascript
使用axios发送post请求,将JSON数据改为form类型的示例
2019/10/31 Javascript
利用python获得时间的实例说明
2013/03/25 Python
由Python运算π的值深入Python中科学计算的实现
2015/04/17 Python
PyQT实现多窗口切换
2018/04/20 Python
python pytest进阶之fixture详解
2019/06/27 Python
python 字典有序并写入json文件过程解析
2019/09/30 Python
python实现复制文件到指定目录
2019/10/16 Python
python实现图片插入文字
2019/11/26 Python
CSS3样式linear-gradient的使用实例
2017/01/16 HTML / CSS
施华洛世奇西班牙官网:SWAROVSKI西班牙
2019/06/06 全球购物
《春笋》教学反思
2014/04/15 职场文书
美术教师个人总结
2015/02/06 职场文书
转正申请报告格式
2015/05/15 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
网吧管理制度范本
2015/08/05 职场文书
解决golang post文件时Content-Type出现的问题
2021/05/02 Golang
Python中可变和不可变对象的深入讲解
2021/08/02 Python
Apache Hudi数据布局黑科技降低一半查询时间
2022/03/31 Servers