Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从堆栈跟踪中获取更多细节_Python_Debugging_Stack Trace - Fatal编程技术网

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

Python 从堆栈跟踪中获取更多细节,python,debugging,stack-trace,Python,Debugging,Stack Trace,有没有一种方便的方法来获取Python异常的更详细堆栈跟踪?我希望找到一个包装器实用程序/模块或其他方法来从堆栈跟踪中获取更多信息,而不必实际修改生成它的Python脚本。我希望能够在运行单元测试或doctest时,或者在从shell运行实用程序或内联脚本时使用它 具体地说,我想我想要局部变量的值,或者可能只是传递给堆栈跟踪中最内层函数的参数的值。一些设置细节级别的选项会很好。您看过回溯模块吗 此外: 与您的问题没有特别关系,但您可能会发现这段代码很有用——在发生致命异常时自动启动py

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


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

您看过回溯模块吗

此外:


与您的问题没有特别关系,但您可能会发现这段代码很有用——在发生致命异常时自动启动python调试器。非常适合使用交互式代码。原来是从

正如所提到的,您可以使用traceback模块中的函数,但您只能获得stacktrace

如果要检查堆栈,必须使用该函数并遍历
回溯
成员,并从其帧(
tbu帧
)转储信息。有关这些类型的更多信息,请参见python

以下是一个例子:

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

嘿,谢谢你。最后,我将您的代码包装在一个脚本中,以便使用
python-mcorniner some_script.py
调用pdb调试。希望没问题吧?我在文件里给了你归属。稍后,我可能会更改模块,以便像我希望的那样吐出堆栈跟踪,这样我就不必用pdb将它们挖出来,这样我就可以将其用于单元测试等。但同时,这可能对某些人有用。嘿,我刚刚意识到,你也可以用
ipython
来做这件事。在传递
-c…
或文件名之前,先传递
-pdb
选项。它似乎不支持
-m…
,但也许可以通过将
/usr/lib/python../runpy.py
作为文件名来实现。
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