【问题标题】:Catching a python app before it exits在 python 应用程序退出之前捕获它
【发布时间】:2011-02-01 21:16:03
【问题描述】:

我有一个 python 应用程序,它应该是非常长寿的,但有时这个过程就消失了,我不知道为什么。发生这种情况时没有任何记录,所以我有点茫然。

在代码中是否有某种方法可以连接到退出事件,或者是否有其他方法可以让我的一些代码在进程退出之前运行?我想记录内存结构的状态,以便更好地了解发生了什么。

【问题讨论】:

    标签: python crash


    【解决方案1】:

    atexit 发音为“退出时”。我第一次读到这个函数名时,我把它读作“一个 texit”,这 几乎 没有多大意义。

    【讨论】:

    • 情况可能会更糟;例如,模块作者可能在工作中度过了忙碌的一天,因此他们在事后为模块命名。 ;)
    【解决方案2】:

    您可以尝试直接从控制台运行您的应用程序(windows 上的 cmd,unix 上的 sh/bash/etc),这样您就可以看到进程终止时打印到控制台的任何堆栈跟踪等。

    【讨论】:

      【解决方案3】:

      我不确定您是否可以修改源代码,但如果可以,您可能想试试这个:

      def debugexcept(type, value, tb):
          if hasattr(sys, 'ps1') or not (sys.stderr.isatty() and sys.stdin.isatty()) or type == SyntaxError:
              sys.__excepthook__(type, value, tb)
          else:
              import traceback, pdb
              traceback.print_exception(type, value, tb)
              print
              pdb.pm()
      
      
      sys.excepthook = debugexcept
      

      如果你从命令行启动你的 python 程序,你应该在它死掉时被转储到 python 调试器中,假设发生了一些“坏事”导致异常。我猜可能 stderr/stdout 已被捕获,而您没有看到异常?

      即搜索类似的内容:

      sys.stdout = open('stdout.log', 'w')
      sys.stderr = open('stderr.log', 'w')
      

      如果进程毫无例外地死亡,那么这可能更难找到。 Windows 上的一种(非常困难的方法)是使用诸如 windbg 之类的东西附加到进程并在 CRT 中的某个相关位置设置断点。

      祝你好运!

      【讨论】:

        猜你喜欢
        • 2011-12-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-29
        • 2015-06-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        相关资源
        最近更新 更多