前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >逆转时间,起死回生——程序报错崩溃后,如何倒回到崩溃的位置?

逆转时间,起死回生——程序报错崩溃后,如何倒回到崩溃的位置?

作者头像
青南
发布2020-06-18 12:33:03
7340
发布2020-06-18 12:33:03
举报
文章被收录于专栏:未闻Code未闻Code

假设我们有一段程序,从 Redis 中读取数据,解析以后提取出里面的 name 字段:

代码语言:javascript
复制
import json
import redis


client = redis.Redis()
def read():
    while True:
        data = client.lpop('info')
        if data:
            yield json.loads(data)
        else:
            break


def parse():
    for data in self.read():
        print(data['name'])


if __name__ == '__main__':
    parse()

代码的逻辑本身很简单,从 Redis 中一条一条读取数据,读到的数据是 JSON 字符串,所以先使用json.loads解析成字典。然后读取字典中的name对应的值。一直读到Redis 列表为空。

我们运行一下看看:

报错了,说明Redis 中的某一条数据有问题。你想看看这条有问题的数据,但是现在程序已经崩溃了,进程结束了,这条有问题的数据也就永久丢失了。你再也不可能知道它长什么样了。

玩过《火焰纹章-风花雪月》的朋友都知道,主角有一个技能叫做天刻之脉动,如果队友死了,他可以逆转时间,回到队友被杀之前,从而改变队友的命运。

那么,在Python里面我们有没有什么办法让程序起死回生,看到当初导致程序报错的那一行代码呢?如果你是使用python3 xxx.py运行的程序,那么确实,除非你能重新导入刚才的数据,否则无法知道。

但是,如果你是使用如下命令:python3 -i xxx.py启动的程序,那么世界就不一样了,你的程序获得了起死回生的能力。你可以重新回到事故现场。

我们恢复一下 Redis 的数据(当然,在生产环境里面你可能就没有办法恢复了。但现在写文章的示例数据,我还是可以回复的^_^)

然后使用python3 -i read_name.py重新运行这个程序:

可以看到,现在虽然程序崩溃了,但是却出现了 Python 的交互环境。进程并没有完全退出。这样一来,我们就可以输入魔法指令,让程序倒退回到报错的那个地方。输入命令:

代码语言:javascript
复制
import pdb
pdb.pm()

运行效果如下图所示:

现在,我们已经回到了报错的那一行了。报错报的是 data这个字典没有name这个 key,那么我们就来看看这个字典里面有什么,直接输入变量名 data:

原来,这一条有问题的数据,是把name写成了name1

总结

pdb是Python自带的调试工具。我们使用的PyCharm的调试功能,也是基于pdb实现的。它还支持更多高级用法,大家可以阅读官方文档pdb — The Python Debugger — Python 3.8.3 documentation[1]

参考资料

[1] pdb — The Python Debugger — Python 3.8.3 documentation: https://docs.python.org/3/library/pdb.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 未闻Code 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 总结
    • 参考资料
    相关产品与服务
    云数据库 Redis
    腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档