在内部跟踪功能,调试函数调用时,是否可以以某种方式检索调用表达式?
我可以从traceback对象中调用行号,但如果该行上有多个函数调用(可能是相同的函数)(例如,作为更大表达式中的子表达式),那么我怎样才能知道这个调用的来源?即使从源线的起点偏移,我也会很高兴.
traceback.tb_lasti似乎给出了更多的粒度上下文(尝试了最后一个字节码的索引) – 是否有可能将字节码连接到其确切的源范围?
解决方法
回溯帧也有一个行号:
lineno = traceback.tb_lineno
name = traceback.tb_frame.f_code.co_name filename = traceback.tb_frame.f_code.co_filename
您可以使用文件名和行号,以及帧全局和linecache
module来有效地将其转换为正确的源代码行:
linecache.checkcache(filename) line = linecache.getline(filename,lineno,traceback.tb_frame.f_globals)
在任何情况下,这都是traceback
module用于将回溯转换为有用信息的内容.
由于字节码只有一个与之关联的行号,因此不能直接将字节码引回到源代码行的精确部分;您必须自己解析该行以确定每个部分将发出的字节码然后将其与代码对象的字节码进行匹配.
您可以使用ast
module执行此操作,但是您不能逐行执行此操作,因为您需要范围上下文来生成本地与单元格与全局名称查找的正确字节码.