sync: Пытаюсь наладить точки останова
This commit is contained in:
@ -61,6 +61,7 @@ class Debugger:
|
||||
self._dbg_dict = dbg_dict
|
||||
self._breakpoints = set()
|
||||
self.__init_callbacks__()
|
||||
self.last_breakpoint: Breakpoint | None = None
|
||||
|
||||
def __init_callbacks__(self):
|
||||
self._callbacks_table = {
|
||||
@ -118,11 +119,14 @@ class Debugger:
|
||||
addr = -1
|
||||
# находим за линейное время. Плохая практика, но так как
|
||||
# сходные коды вряд ли будут длиннее 1000 строк - приемлемо
|
||||
for addr, desc in self._dbg_dict.items():
|
||||
print(self._dbg_dict)
|
||||
for addr, desc in self._dbg_dict["instructions"].items():
|
||||
print("_______________", desc, "__________")
|
||||
desc = cast(DbgInstrDesc, desc)
|
||||
if not desc["srcline"] == desired_addr:
|
||||
continue
|
||||
self._breakpoints.add(int(addr))
|
||||
self._vm.breakpoints.add(int(addr))
|
||||
return f"Breakpoint succesfully set on line {desired_addr}"
|
||||
|
||||
return f"Couldn't place breakpoint on src line {desired_addr}"
|
||||
@ -154,8 +158,9 @@ class Debugger:
|
||||
def _run(self, args: list[str]) -> str:
|
||||
try:
|
||||
self._vm.run()
|
||||
except Breakpoint:
|
||||
return ""
|
||||
except Breakpoint as b:
|
||||
return (f'breakpoint on line '
|
||||
f'{self._dbg_dict["instructions"][b.address]["srcline"]}')
|
||||
return "Program finished"
|
||||
|
||||
def _inspect(self, args: list[str]) -> str:
|
||||
@ -187,3 +192,15 @@ class Debugger:
|
||||
)
|
||||
return f"{mem_location}:" + " ".join(map(str, contents))
|
||||
|
||||
def _recover_from_breakpoint(self, cur_bp: Breakpoint):
|
||||
"""
|
||||
Когда виртуальная машина сталкивается с точкой останова, она на
|
||||
ней зависает навечно. Для продолжения работы надо текущую точку
|
||||
останова убрать, сделать шаг, а потом добавить. Предыдущая точка
|
||||
остановка как раз хранится в дебаггере
|
||||
"""
|
||||
if not self.last_breakpoint:
|
||||
return
|
||||
if cur_bp.address != self.last_breakpoint.address:
|
||||
return
|
||||
self._vm.breakpoints.remove(cur_bp.address)
|
||||
|
||||
@ -59,6 +59,7 @@ class VM:
|
||||
self._initial_mem = mem.copy()
|
||||
self.__init_callbacks__()
|
||||
self.reset()
|
||||
self.breakpoints: set[int] = set()
|
||||
|
||||
def __init_callbacks__(self):
|
||||
VM.instr_callbacks = {
|
||||
@ -126,7 +127,6 @@ class VM:
|
||||
self.cc: VMCC = VMCC(0)
|
||||
self.pc: c_uint32 = c_uint32(0)
|
||||
self.registers: list[c_int32] = [c_int32(0) for _ in range(256)]
|
||||
self.breakpoints: set[int] = set()
|
||||
self._vm_flags: VMFlags = VMFlags(0)
|
||||
self.status = VMStatus.INITED
|
||||
|
||||
|
||||
Reference in New Issue
Block a user