Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 11 additions & 3 deletions qiling/debugger/qdb/memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -167,8 +167,19 @@ def parse(self, line: str):
for each in output:
print(f"0x{each.address:x}: {each.mnemonic}\t{each.op_str}")

elif ft == "s":
# handle read c-style string
try:
print(f"0x{addr:08x}: {self.ql.os.utils.read_cstring(addr)}")
except:
return f"error reading c-style string at 0x{addr:08x}"

else:
lines = 1 if ct <= 4 else math.ceil(ct / 4)
# parse command
prefix = "0x" if ft in ("x", "a") else ""
pad = '0' + str(sz*2) if ft in ('x', 'a', 't') else ''
ft = ft.lower() if ft in ("x", "o", "b", "d") else ft.lower().replace("t", "b").replace("a", "x")

mem_read = []
for offset in range(ct):
Expand All @@ -186,9 +197,6 @@ def parse(self, line: str):
idx = line * self.ql.arch.pointersize
for each in mem_read[idx:idx+self.ql.arch.pointersize]:
data = self.fmt_unpack(each, sz)
prefix = "0x" if ft in ("x", "a") else ""
pad = '0' + str(sz*2) if ft in ('x', 'a', 't') else ''
ft = ft.lower() if ft in ("x", "o", "b", "d") else ft.lower().replace("t", "b").replace("a", "x")
print(f"{prefix}{data:{pad}{ft}}\t", end="")

print()
Expand Down
15 changes: 12 additions & 3 deletions qiling/debugger/qdb/qdb.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,8 +229,12 @@ def do_step_in(self, *args) -> Optional[bool]:
if self.ql.arch == QL_ARCH.CORTEX_M:
self.ql.arch.step()
else:
self._run(count=1)
step = 1
# make sure follow branching
if prophecy.going is True and self.ql.arch.type == QL_ARCH.MIPS:
step += 1

self._run(count=step)
self.do_context()

@SnapshotManager.snapshot
Expand All @@ -245,7 +249,12 @@ def do_step_over(self, *args) -> Optional[bool]:

if prophecy.going:
cur_insn = self.predictor.disasm(self.cur_addr)
self.set_breakpoint(self.cur_addr + cur_insn.size, is_temp=True)
bp_addr = self.cur_addr + cur_insn.size

if self.ql.arch.type == QL_ARCH.MIPS:
bp_addr += cur_insn.size

self.set_breakpoint(bp_addr, is_temp=True)

else:
self.set_breakpoint(prophecy.where, is_temp=True)
Expand Down Expand Up @@ -437,7 +446,7 @@ def do_show(self, *args) -> None:
"""

for info_line in self.ql.mem.get_formatted_mapinfo():
self.ql.log.info(info_line)
qdb_print(QDB_MSG.INFO, info_line)

qdb_print(QDB_MSG.INFO, f"Breakpoints: {[hex(addr) for addr in self.bp_list.keys()]}")
qdb_print(QDB_MSG.INFO, f"Marked symbol: {[{key:hex(val)} for key,val in self.marker.mark_list]}")
Expand Down
3 changes: 1 addition & 2 deletions qiling/debugger/qdb/render/render.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ def render_stack_dump(self, arch_sp: int) -> None:
if (val := self.try_read_pointer(addr)[0]): # defined to be try_read_pointer(addr)[0] - dereferneces pointer

# @TODO: Bug here where the values on the stack are being displayed in 32-bit format
print(f"RSP + 0x{idx*self.pointersize:02x}│ [0x{addr:08x}] —▸ 0x{self.unpack(val):08x}", end="")
print(f"SP + 0x{idx*self.pointersize:02x}│ [0x{addr:08x}] —▸ 0x{self.unpack(val):08x}", end="")

# try to dereference wether it's a pointer
if (buf := self.try_read_pointer(addr))[0] is not None:
Expand Down Expand Up @@ -188,7 +188,6 @@ def context_stack(self) -> None:
display context stack dump
"""

print(f"{self.ql.arch.regs.arch_sp:x}")
self.render_stack_dump(self.ql.arch.regs.arch_sp)

@Render.divider_printer("[ REGISTERS ]")
Expand Down