从堆栈跟踪中获取更多细节

时间:2010-10-12 04:09:36

标签: python debugging stack-trace

是否有一种方便的方法可以在Python异常上获得更详细的堆栈跟踪?我希望找到一个包装器实用程序/模块或其他一些方法从堆栈跟踪中获取更多信息,而不必实际修改生成它的Python脚本。我希望能够在运行单元测试或doctests时,或者从shell运行实用程序或内联脚本时使用它。

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

3 个答案:

答案 0 :(得分:2)

与您的问题没有特别的关系,但您可能会发现此代码很有用 - 当发生致命异常时自动启动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

答案 1 :(得分:0)

答案 2 :(得分:0)

正如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