从堆栈跟踪中获取更多详细信息
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
【讨论】:
以上是关于从堆栈跟踪中获取更多详细信息的主要内容,如果未能解决你的问题,请参考以下文章