Выполнение отдельных кодов операций из отладчика
Я написал 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 .