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,但我不太明白如何使其工作。
谈论TracebackExceptions它的capture_locals论证,我们可以如下使用它:
#!/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\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n看起来有点过于冗长,但有时这些数据对于调试某些崩溃可能至关重要。
\n2018-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\nRun Code Online (Sandbox Code Playgroud)\n