Выполнение отдельных кодов операций из отладчика

Я написал 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

или т.п; Питона sys.settrace останавливается на каждой строке, но это все. Я мог бы решить эту проблему, выполнив отдельные коды операций и прочитав стек фрейма... но как я могу это сделать?

Есть ли способ пройти через отдельные коды операций (в отличие от строк) в Python?

1 ответ

Начиная с Python 3.7, вы можете установитьf_trace_opcodesна объекте кадра, который вы получаете от функции трассировки. Затем вы сможете пойматьopcodeсобытие для эффективного пошагового выполнения кода операции. В более старых версиях Python вы можете использовать трюк с повторным выравниванием каждого кода операции на новой строке (см. https://github.com/P403n1x87/podb/commit/975350ccb1496e3093380797f9fefbf1d102ae2e). Пример экспериментального отладчика на основе кода операции для бедняков находится по адресу https://github.com/P403n1x87/podb .

Другие вопросы по тегам