从堆栈跟踪中获取更多详细信息

Posted

技术标签:

【中文标题】从堆栈跟踪中获取更多详细信息【英文标题】:Getting more detail from stack traces 【发布时间】:2010-10-12 04:09:35 【问题描述】:

有没有一种方便的方法来获取有关 Python 异常的更详细的堆栈跟踪?我希望找到一个包装实用程序/模块或其他方式来从堆栈跟踪中获取更多信息,而无需实际修改生成它的 Python 脚本。我希望能够在运行单元测试、文档测试或从 shell 运行实用程序或内联脚本时使用它。

具体来说,我想我想要局部变量的值,或者只是传递给堆栈跟踪中最内层函数的参数值。一些设置细节级别的选项会很不错。

【问题讨论】:

【参考方案1】:

与您的问题没有特别相关,但您可能会发现此代码很有用——当发生致命异常时自动启动 python 调试器。适合使用交互式代码。最初来自ActiveState

# code snippet, to be included in 'sitecustomize.py'
import sys

def info(type, value, tb):
   if hasattr(sys, 'ps1') or not sys.stderr.isatty():
      # we are in interactive mode or we don't have a tty-like
      # device, so we call the default hook
      sys.__excepthook__(type, value, tb)
   else:
      import traceback, pdb
      # we are NOT in interactive mode, print the exception...
      traceback.print_exception(type, value, tb)
      print
      # ...then start the debugger in post-mortem mode.
      pdb.pm()

sys.excepthook = info

【讨论】:

嘿,谢谢。我最终将您的代码包装在module 中,以便于使用python -m coroner some_script.py 调用pdb 调试。嗯,希望没问题?我在文档中给了你归属。稍后我可能会更改模块以吐出我想要的堆栈跟踪,这样我就不必用 pdb 挖掘它们,所以我可以将它用于单元测试等。不过,与此同时,这可能对某些人有用。 嘿,你也可以用ipython 来做这个,我刚刚意识到。在传递 -c ... 或文件名之前传递 -pdb 选项。它似乎不支持-m ...,但也许可以通过将/usr/lib/python../runpy.py 作为文件名来实现。【参考方案2】:

你看过traceback模块吗?

http://docs.python.org/library/traceback.html

同样在 SO:

Showing the stack trace from a running Python application

【讨论】:

【参考方案3】:

正如pyfunc 所提到的,您可以在 traceback 模块中使用该函数,但您只能得到一个堆栈跟踪。

如果您想检查堆栈,您必须使用 sys.exc_info() 函数并遍历 traceback 成员并从其框架 (tb_frame) 中转储信息。有关这些类型的更多信息,请参阅 python Reference Manual。

这是一个例子:

def killit(a):
    a[10000000000000] = 1

def test(a):
    killit(a)

def iterate_traceback(tb):
    while tb is not None:
        yield tb
        tb = tb.tb_next

try:
    test(tuple())
except Exception as e:

    import sys
    exception_info = sys.exc_info()

    traceback = exception_info[2]
    for tb in iterate_traceback(traceback):
        print "-" * 10
        print tb.tb_frame.f_code
        print tb.tb_frame.f_locals
        print tb.tb_frame.f_globals

【讨论】:

以上是关于从堆栈跟踪中获取更多详细信息的主要内容,如果未能解决你的问题,请参考以下文章

带有更多艺术家详细信息的 Spotify API 跟踪请求

获取堆栈跟踪中的参数值

详细的堆栈跟踪:错误:找不到模块“条带”

获取导致异常的表单名称、方法名称和更多详细信息

用于获取 aws 堆栈层实例和标签详细信息的 Python 脚本

请问:从字符串转换日期和/或时间时,转换失败。怎么修改