我写了一个sys.settrace
函数:
import sys
def tracefunc(frame, event, arg):
if event == 'call':
if '__debug_me__' in frame.f_code.co_names:
return tracefunc
return None
if frame is not None:
print(event, frame.f_code, frame.f_lasti)
# I am stuck here
字符串
每当遇到STORE_NAME
时,我想这样做:
print(frame.f_code.co_names[namei], old_val, new_val)
型
但我想不出有什么方法可以证明
x=1;y=2;z=3
型
或类似物; Python的sys.settrace
在每一行都停止,但仅此而已。我可以通过执行单独的操作码和阅读帧的堆栈来解决这个问题。但我怎么能做到呢
在Python中,有没有什么方法可以单步执行单个操作码(而不是行)?
1条答案
按热度按时间f2uvfpb91#
从Python 3.7开始,您可以在跟踪函数中获得的frame对象上设置
f_trace_opcodes
。然后,您可以捕获opcode
事件,以有效地逐操作码进行操作。对于较旧版本的Python,您可以使用在新行中重新对齐每个操作码的技巧(参见https://github.com/P403n1x87/podb/commit/975350ccb1496e3093380797f9fefbf1d102ae2e)。https://github.com/P403n1x87/podb是一个实验性的穷人的基于操作码的调试器的例子