debugging 从调试器执行单个操作码

ne5o7dgx  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(118)

我写了一个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中,有没有什么方法可以单步执行单个操作码(而不是行)?

f2uvfpb9

f2uvfpb91#

从Python 3.7开始,您可以在跟踪函数中获得的frame对象上设置f_trace_opcodes。然后,您可以捕获opcode事件,以有效地逐操作码进行操作。对于较旧版本的Python,您可以使用在新行中重新对齐每个操作码的技巧(参见https://github.com/P403n1x87/podb/commit/975350ccb1496e3093380797f9fefbf1d102ae2e)。https://github.com/P403n1x87/podb是一个实验性的穷人的基于操作码的调试器的例子

相关问题