如果您需要进一步的信息,您需要检查
frame
传递到跟踪函数的参数。尤其是,你想看看
frame.f_lasti
查找最后执行的指令和
frame.f_code.co_code
访问该指令。同时使用这两个代码将给出实际的操作码。如果你想用助记符,那你就要用
dis.opname
;但是,如果您只是简单地将它与另一个操作码进行匹配,那么您可以使用
dis.opmap
相反。下面的示例是人为的,但它演示了使用刚刚提供的提示可能实现的一些功能:
#! /usr/bin/env python3
import dis
import sys
def main():
dis.dis(add)
sys.settrace(get_trace(False, get_callback(celebrate)))
total = add(1, 2)
print(f'total = {total}')
sys.settrace(None)
total = add(3, 4)
print(f'total = {total}')
print('Done')
def get_trace(trace_lines=True, opcode_callback=None):
trace_opcodes = callable(opcode_callback)
# noinspection PyUnusedLocal
def trace(frame, event, arg):
frame.f_trace_lines = trace_lines
frame.f_trace_opcodes = trace_opcodes
if trace_opcodes and event == 'opcode':
opcode = frame.f_code.co_code[frame.f_lasti]
opname = dis.opname[opcode]
opcode_callback(frame, opcode, opname)
return trace
return trace
def get_callback(return_handler=None):
handle_return = callable(return_handler)
def echo_opcode(frame, opcode, opname):
print(f'# {opname} ({opcode}) #')
if handle_return and opcode == dis.opmap['RETURN_VALUE']:
return_handler(frame)
return echo_opcode
# noinspection PyUnusedLocal
def celebrate(frame):
print('/-------------------\\')
print('| We are returning! |')
print('\\-------------------/')
def add(a, b):
return a + b
if __name__ == '__main__':
main()