diff --git a/src/dp32proto/dpdebugger.py b/src/dp32proto/dpdebugger.py index af7d055..4167cb2 100644 --- a/src/dp32proto/dpdebugger.py +++ b/src/dp32proto/dpdebugger.py @@ -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) diff --git a/src/dp32proto/vm.py b/src/dp32proto/vm.py index 302750c..ae23a32 100644 --- a/src/dp32proto/vm.py +++ b/src/dp32proto/vm.py @@ -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