我正在尝试创建一个调试器函数,当出现错误时会调用该函数,并让我访问控制台,以便可以检查程序中发生了什么。 这是基本功能:
def DEBUGGER(error):
print(error)
print("[DEBUGGER] Your program has failed, here is the debugger. Enter EXIT to end program.")
while True:
line = input(">>> ").lower()
if line == 'exit':
sys.exit(0)
else:
try:
exec(line)
except Exception as e:
print(str(e))
问题是我无法输入类似print(var)
的内容,因为它是在另一个函数中引用的。
全局函数对我没有帮助,因为我希望能够在程序中调用任何变量,并且无法对它们进行全局化。.我知道我可以通过将所有函数放在类中来解决该问题,但我不能原因很多。
有没有办法获取正在运行的函数的局部变量? (当我调用DEBUGGER()
时,母函数仍在运行)
如果否,是否可以导出当前函数的局部变量并将其作为参数传递给DEBUGGER()
?
感谢您的回答。
答案 0 :(得分:5)
您基本上是在重新实现Python debugger pdb
。如果您想走这条路,您可能要study the source code。 pdb
本身是围绕较低级别bdb
(basic debugger) module和source code for that is also available的用户界面。
要回答您的直接问题:捕获异常时,您可以访问traceback object(通过exception.__traceback__
或sys.exc_info()
),并且回溯访问本地和本地。通过tb_frame
属性,堆栈中每个框架的全局名称空间。该属性设置为frame object,具有f_locals
和f_globals
属性。
bdb.Bdb.get_stack()
method可能是一个有关如何处理回溯的有趣示例,然后internal pdb.Pdb._select_frame()
method用于从堆栈中选择一帧以使用本地和全局变量。
如果您不想重新实现完整的调试器,则可以使用pdb.pm()
或pdb.port_mortem()
函数。这些会带出最后一次追溯,并让您在交互式环境中检查堆栈框架:
try:
exec(line)
except Exception as e:
pdb.post_mortem(e.__traceback__)
答案 1 :(得分:0)
“编写”“ DEBUGGER”功能的正确方法是:
import pdb
DEBUGGER = pdb.set_trace
现在,您可以在任意位置调用DEBUGGER()
,您将处于一个交互式环境中,不仅可以访问本地变量,还可以访问整个调用堆栈,并且可以逐步执行其余代码(包括进入其他功能等),更改控制流以从另一行等继续执行等。
哦,是的:您当然可以只写import pdb; pdb.set_trace()
;;-)