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字符串、元组、列表、字典互相转换的方法
Jan 23 Python
关于numpy中np.nonzero()函数用法的详解
Feb 07 Python
Python实现定时任务
Feb 08 Python
Python语言生成水仙花数代码示例
Dec 18 Python
Anaconda 离线安装 python 包的操作方法
Jun 11 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
python修改字典键(key)的方法
Aug 05 Python
python getpass实现密文实例详解
Sep 24 Python
python通用读取vcf文件的类(复制粘贴即可用)
Feb 29 Python
深入浅析Python 命令行模块 Click
Mar 11 Python
解决Python中报错TypeError: must be str, not bytes问题
Apr 07 Python
使用python脚本自动生成K8S-YAML的方法示例
Jul 12 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中ftp_chdir与ftp_cdup函数用法
2014/11/18 PHP
PHP+jquery实时显示网站在线人数的方法
2015/01/04 PHP
php断点续传之文件分割合并详解
2016/12/13 PHP
PHP后端银联支付及退款实例代码
2017/06/23 PHP
基于php流程控制语句和循环控制语句(讲解)
2017/10/23 PHP
php进程(线程)通信基础之System V共享内存简单实例分析
2019/11/09 PHP
jQuery+ajax实现顶一下,踩一下效果
2010/07/17 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
jquery.ajax的url中传递中文乱码问题的解决方法
2014/02/07 Javascript
Javascript验证用户输入URL地址是否为空及格式是否正确
2014/10/09 Javascript
JavaScript字符串对象slice方法入门实例(用于字符串截取)
2014/10/16 Javascript
基于jQuery实现左右图片轮播(原理通用)
2015/12/24 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
2017/07/13 Javascript
javascript流程控制语句集合
2017/09/18 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
vue多层嵌套路由实例分析
2019/03/19 Javascript
如何解决日期函数new Date()浏览器兼容性问题
2019/09/11 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
如何实现js拖拽效果及原理解析
2020/05/08 Javascript
在nuxt中使用路由重定向的实例
2020/11/06 Javascript
微信小程序开发数据缓存基础知识辨析及运用实例详解
2020/11/06 Javascript
[11:33]DAC2018 4.5SOLO赛决赛 MidOne vs Paparazi第二场
2018/04/06 DOTA
[01:03:47]VP vs NewBee Supermajor 胜者组 BO3 第一场 6.5
2018/06/06 DOTA
Python Web框架Pylons中使用MongoDB的例子
2013/12/03 Python
Python random模块常用方法
2014/11/03 Python
Python获取系统默认字符编码的方法
2015/06/04 Python
Python下载指定页面上图片的方法
2016/05/12 Python
Python 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
2018/03/19 Python
py-charm延长试用期限实例
2019/12/22 Python
django使用多个数据库的方法实例
2021/03/04 Python
街道社区活动报告
2015/02/05 职场文书
2015年上半年计生工作总结
2015/03/30 职场文书
市场营销计划书
2019/04/24 职场文书
python中如何对多变量连续赋值
2021/06/03 Python