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字符串str和字节数组相互转化方法
Mar 18 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
Jun 30 Python
python技能之数据导出excel的实例代码
Aug 11 Python
浅谈Django中的数据库模型类-models.py(一对一的关系)
May 30 Python
python连接、操作mongodb数据库的方法实例详解
Sep 11 Python
详解Django将秒转换为xx天xx时xx分
Sep 27 Python
python实现滑雪者小游戏
Feb 22 Python
Python读取yaml文件的详细教程
Jul 21 Python
爬虫代理的cookie如何生成运行
Sep 22 Python
python 用opencv实现霍夫线变换
Nov 27 Python
Python实现京东抢秒杀功能
Jan 25 Python
Python 中数组和数字相乘时的注意事项说明
May 10 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
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
19个超实用的PHP代码片段
2014/03/14 PHP
PHP实现QQ登录的开原理和实现过程
2018/02/04 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
Jquery AJAX 用于计算点击率(统计)
2010/06/30 Javascript
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
JS中window.open全屏命令解析及使用示例
2013/12/11 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
Angular.Js的自动化测试详解
2016/12/09 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
详解Vue2.0组件的继承与扩展
2018/11/23 Javascript
node.js 基于cheerio的爬虫工具的实现(需要登录权限的爬虫工具)
2019/04/10 Javascript
Jquery让form表单异步提交代码实现
2019/11/14 jQuery
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
[20:57]Ti4主赛事第三天开幕式
2014/07/21 DOTA
Python中List.index()方法的使用教程
2015/05/20 Python
Python实现将DOC文档转换为PDF的方法
2015/07/25 Python
Python实现PS图像明亮度调整效果示例
2018/01/23 Python
对python mayavi三维绘图的实现详解
2019/01/08 Python
python使用socket实现的传输demo示例【基于TCP协议】
2019/09/24 Python
python 模拟创建seafile 目录操作示例
2019/09/26 Python
Python tkinter和exe打包的方法
2020/02/05 Python
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
HTML5之SVG 2D入门13—svg对决canvas及长处和适用场景分析
2013/01/30 HTML / CSS
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
马来西亚排名第一的宠物用品店:Pets Wonderland
2020/04/16 全球购物
南京某公司笔试题
2013/01/27 面试题
大学本科生的个人自我评价
2013/12/09 职场文书
远程网络教育毕业生自我鉴定
2014/04/14 职场文书
2014年保育员工作总结
2014/12/02 职场文书
小石潭记导游词
2015/02/03 职场文书
教师个人年度总结
2015/02/11 职场文书
SpringBoot整合minio快速入门教程(代码示例)
2022/04/03 Java/Android
阿里云 Windows server 2019 配置FTP
2022/04/28 Servers