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的list相关知识(推荐)
Aug 30 Python
浅谈Python处理PDF的方法
Nov 10 Python
Python内置模块hashlib、hmac与uuid用法分析
Feb 12 Python
python实现爬取图书封面
Jul 05 Python
python解析json串与正则匹配对比方法
Dec 20 Python
python将控制台输出保存至文件的方法
Jan 07 Python
用python实现刷点击率的示例代码
Feb 21 Python
详解Python静态网页爬取获取高清壁纸
Apr 23 Python
开启Django博客的RSS功能的实现方法
Feb 17 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
Jun 02 Python
python多线程爬取西刺代理的示例代码
Jan 30 Python
Python编写车票订购系统 Python实现快递收费系统
Aug 14 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
javascript,php获取函数参数对象的代码
2011/02/03 PHP
php数字转汉字代码(算法)
2011/10/08 PHP
hadoop中一些常用的命令介绍
2013/06/19 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
源码分析 Laravel 重复执行同一个队列任务的原因
2017/12/25 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
2019/11/24 PHP
选择TreeView控件的树状数据节点的JS方法(jquery)
2010/02/06 Javascript
一个很简单的jquery+xml+ajax的无刷新树结构(无css,后台是c#)
2010/06/02 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
微信小程序实现滑动删除效果
2017/05/19 Javascript
Vue 去除路径中的#号
2018/04/19 Javascript
[32:30]夜魇凡尔赛茶话会 第一期01:谁是卧底
2021/03/11 DOTA
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
python制作一个桌面便签软件
2015/08/09 Python
Win7 64位下python3.6.5安装配置图文教程
2020/10/27 Python
python发送告警邮件脚本
2018/09/17 Python
Python中一些深不见底的“坑”
2019/06/12 Python
Python2与Python3的区别点整理
2019/12/12 Python
python与mysql数据库交互的实现
2020/01/06 Python
Python如何实现邮件功能
2020/05/27 Python
详解Python 最短匹配模式
2020/07/29 Python
详解Python3 定义一个跨越多行的字符串的多种方法
2020/09/06 Python
python中lower函数实现方法及用法讲解
2020/12/23 Python
暑期实践思想汇报
2014/01/06 职场文书
大学同学十年聚会感言
2014/02/21 职场文书
党员干部2014全国两会学习心得体会
2014/03/10 职场文书
党的群众路线教育实践活动公开承诺书
2014/03/28 职场文书
考核评语大全
2014/04/29 职场文书
验房委托书
2014/08/30 职场文书
2014年法院工作总结
2014/11/24 职场文书
2014年食品安全工作总结
2014/12/04 职场文书
打架检讨书范文
2015/01/27 职场文书
中秋节寄语2015
2015/03/24 职场文书
2015年统计员个人工作总结
2015/07/23 职场文书
小学数学新课改心得体会
2016/01/22 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书