我正在尝试创建一个调试器函数,该函数在引发错误时调用,让我访问控制台,以便检查程序中发生了什么.这是基本功能:
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))
Run Code Online (Sandbox Code Playgroud)
问题是我不能输入类似print(var)因为它在另一个函数中引用的东西.Globals函数对我没有帮助,因为我希望能够在我的程序中调用任何变量,并且我无法将它们全局化.我知道我可以通过将所有函数放在类中来解决它但我不能很多原因.
有没有办法获取运行函数的局部变量?(当我打电话时DEBUGGER(),母功能仍在运行)
如果不是,我可以导出当前函数的局部变量并将其作为参数传递给DEBUGGER()?
谢谢你的回答.
您基本上是重新实现Python调试器pdb.如果你想走这条路,你可能想学习源代码.pdb本身是低级bdb(基本调试器)模块周围的用户界面,其源代码也可用.
回答直接问题:当您捕获异常时,您可以访问回溯对象(通过exception.__traceback__或通过sys.exc_info()),并且回溯可以通过tb_frame属性访问堆栈中每个帧的本地和全局命名空间.该属性被设置为一个框对象,其具有f_locals和f_globals属性.
该bdb.Bdb.get_stack()方法可能是一个关于如何处理回溯的有趣示例,然后内部pdb.Pdb._select_frame()方法用于从堆栈中选择一个框架以使用来自的locals和globals.
如果您不想重新实现完整的调试器,则可以使用pdb.pm()或pdb.port_mortem()函数.这些会引发最后一次回溯,让您在交互式环境中检查堆栈帧:
try:
exec(line)
except Exception as e:
pdb.post_mortem(e.__traceback__)
Run Code Online (Sandbox Code Playgroud)