• Python 程序报错崩溃后,如何倒回到崩溃的位置?


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

    很多人学习python,不知道从何学起。
    很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
    很多已经做案例的人,却不知道如何去学习更加高深的知识。
    那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
    QQ群:1097524789

    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 的交互环境。进程并没有完全退出。这样一来,我们就可以输入魔法指令,让程序倒退回到报错的那个地方。输入命令:

    import pdbpdb.pm()
    

    运行效果如下图所示:

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

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

    总结

    pdb是Python自带的调试工具。我们使用的PyCharm的调试功能,也是基于pdb实现的。

  • 相关阅读:
    cpuset
    top
    path-lookup
    strace
    IDR算法[原理]
    cgroup
    转载
    std::reverse_iterator::base
    可重入、不可重入
    chromium code 中 普遍使用的 C++11 语法
  • 原文地址:https://www.cnblogs.com/shann001/p/13202969.html
Copyright © 2020-2023  润新知