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