sync: Пытаюсь наладить точки останова

This commit is contained in:
ElectronixTM
2025-04-03 09:14:24 +03:00
parent 1aade33b48
commit 6a4a02ffb9
2 changed files with 21 additions and 4 deletions

View File

@ -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)

View File

@ -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