将参数值打印到堆栈跟踪中的函数

War*_*her 5 python debugging stack-trace

当打印错误堆栈跟踪时,如何打印传递给调用堆栈中的函数的参数值?我希望输出与下面的示例完全相同。

例子:

Traceback (most recent call last):
  File "./file.py", line 615, in func0 **(arg0) arg0 = 0 was passed**
    result = func1(arg1, arg2)
  File "./file.py", line 728, in func1 **(arg1, arg2) arg1 = 1 and arg2 = 2 was passed**
    return int_value[25]
TypeError: 'int' object is not iterable
Run Code Online (Sandbox Code Playgroud)

除了堆栈跟踪中的正常输出之外,我还希望打印上面 ** ** 内的信息。我的设想是调试器也会自动打印传递的参数。这将清楚地显示数据传递的“功能管道”、管道中发生了什么以及哪个函数没有执行其应该执行的操作。这将有助于调试很多。

我搜索了很多,发现了这些相关问题:

但他们的答案都不适合我:第一个答案导致了ModuleNotFoundError: No module named 'stackdump'。第二个问题的答案使我的ipython解释器因非常长的堆栈跟踪而崩溃。

我也抬头一看:

s似乎有一个capture_locals变量TracebackException,但我不太明白如何使其工作。

Gra*_*dma 7

纯Python3

\n

谈论TracebackExceptions它的capture_locals论证,我们可以如下使用它:

\n
#!/usr/bin/env python3\n\nimport traceback\n\nc = [\'Help me!\']\n\ndef bar(a = 3):\n    d = {1,2,3}\n    e = {}\n    foo(a)\n\ndef foo(a=4):\n    b = 4\n    if a != b:\n        raise Exception("a is not equal to 4")\n\ntry:\n    bar(3)\nexcept Exception as ex:\n    tb = traceback.TracebackException.from_exception(ex, capture_locals=True)\n    print("".join(tb.format()))\n\n
Run Code Online (Sandbox Code Playgroud)\n

它打印每个帧的所有局部变量:

\n
$ ./test.py \nTraceback (most recent call last):\n  File "./test.py", line 21, in <module>\n    bar(3)\n    __annotations__ = {}\n    __builtins__ = <module \'builtins\' (built-in)>\n    __cached__ = None\n    __doc__ = None\n    __file__ = \'./test.py\'\n    __loader__ = <_frozen_importlib_external.SourceFileLoader object at 0x7f81073704c0>\n    __name__ = \'__main__\'\n    __package__ = None\n    __spec__ = None\n    bar = <function bar at 0x7f81073b11f0>\n    c = [\'Help me!\']\n    ex = Exception(\'a is not equal to 4\')\n    foo = <function foo at 0x7f810728a160>\n    traceback = <module \'traceback\' from \'/usr/lib/python3.8/traceback.py\'>\n  File "./test.py", line 11, in bar\n    foo(a)\n    a = 3\n    d = {1, 2, 3}\n    e = {}\n  File "./test.py", line 17, in foo\n    raise Exception("a is not equal to 4")\n    a = 3\n    b = 4\nException: a is not equal to 4\n
Run Code Online (Sandbox Code Playgroud)\n

看起来有点过于冗长,但有时这些数据对于调试某些崩溃可能至关重要。

\n

洛古鲁

\n

还有一个包loguru打印“完全描述性异常”:

\n
2018-07-17 01:38:43.975 | ERROR    | __main__:nested:10 - What?!\nTraceback (most recent call last):\n\n  File "test.py", line 12, in <module>\n    nested(0)\n    \xe2\x94\x94 <function nested at 0x7f5c755322f0>\n\n> File "test.py", line 8, in nested\n    func(5, c)\n    \xe2\x94\x82       \xe2\x94\x94 0\n    \xe2\x94\x94 <function func at 0x7f5c79fc2e18>\n\n  File "test.py", line 4, in func\n    return a / b\n           \xe2\x94\x82   \xe2\x94\x94 0\n           \xe2\x94\x94 5\n\nZeroDivisionError: division by zero\n
Run Code Online (Sandbox Code Playgroud)\n