From 32ba12de47134f87d53692789d407433407eca5e Mon Sep 17 00:00:00 2001 From: d-millar <33498836+d-millar@users.noreply.github.com> Date: Fri, 3 May 2024 14:10:10 -0400 Subject: [PATCH] GP-4365: Use attribute aliases --- .../src/main/py/src/ghidradbg/commands.py | 91 +++--- .../src/main/py/src/ghidradbg/hooks.py | 4 +- .../src/main/py/src/ghidradbg/schema.xml | 282 +++--------------- .../src/main/py/src/ghidrattd/commands.py | 71 ++--- .../src/main/py/src/ghidrattd/hooks.py | 2 +- .../src/main/py/src/ghidrattd/methods.py | 32 +- .../src/main/py/src/ghidrattd/schema.xml | 257 +++------------- .../src/main/py/src/ghidrattd/util.py | 2 +- .../gdb/model/impl/GdbModelTargetModule.java | 2 +- .../gdb/model/impl/GdbModelTargetSection.java | 2 +- .../src/main/py/src/ghidragdb/commands.py | 95 +++--- .../src/main/py/src/ghidragdb/hooks.py | 4 +- .../src/main/py/src/ghidragdb/schema.xml | 242 +++------------ .../src/main/py/src/ghidralldb/commands.py | 65 ++-- .../src/main/py/src/ghidralldb/hooks.py | 5 +- .../src/main/py/src/ghidralldb/methods.py | 2 +- .../src/main/py/src/ghidralldb/schema.xml | 271 ++++------------- 17 files changed, 381 insertions(+), 1048 deletions(-) diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/commands.py b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/commands.py index adcd78d6c0..09b4bbddfc 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/commands.py +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/commands.py @@ -210,9 +210,11 @@ def start_trace(name): schema_fn = os.path.join(parent, 'schema.xml') with open(schema_fn, 'r') as schema_file: schema_xml = schema_file.read() + using_dbgmodel = os.getenv('OPT_USE_DBGMODEL') == "true" + variant = " (dbgmodel)" if using_dbgmodel else " (dbgeng)" with STATE.trace.open_tx("Create Root Object"): - root = STATE.trace.create_root_object(schema_xml, 'Root') - root.set_value('_display', util.DBG_VERSION.full + ' via pybag') + root = STATE.trace.create_root_object(schema_xml, 'DbgRoot') + root.set_value('_display', util.DBG_VERSION.full + ' via pybag' + variant) util.set_convenience_variable('_ghidra_tracing', "true") @@ -867,9 +869,9 @@ def put_processes(running=False): procobj = STATE.trace.create_object(ipath) istate = compute_proc_state(i) - procobj.set_value('_state', istate) + procobj.set_value('State', istate) pid = p[0] - procobj.set_value('_pid', pid) + procobj.set_value('PID', pid) procobj.set_value('_display', '{:x} {:x}'.format(i, pid)) if len(p) > 1: procobj.set_value('Name', str(p[1])) @@ -882,13 +884,13 @@ def put_state(event_process): ipath = PROCESS_PATTERN.format(procnum=event_process) procobj = STATE.trace.create_object(ipath) state = compute_proc_state(event_process) - procobj.set_value('_state', state) + procobj.set_value('State', state) procobj.insert() tnum = util.selected_thread() if tnum is not None: ipath = THREAD_PATTERN.format(procnum=event_process, tnum=tnum) threadobj = STATE.trace.create_object(ipath) - threadobj.set_value('_state', state) + threadobj.set_value('State', state) threadobj.insert() @@ -922,7 +924,7 @@ def put_available(): keys.append(AVAILABLE_KEY_PATTERN.format(pid=id)) pidstr = ('0x{:x}' if radix == 16 else '0{:o}' if radix == 8 else '{}').format(id) - procobj.set_value('_pid', id) + procobj.set_value('PID', id) procobj.set_value('Name', name) procobj.set_value('_display', '{} {}'.format(pidstr, name)) procobj.insert() @@ -973,22 +975,22 @@ def put_single_breakpoint(bp, ibobj, nproc, ikeys): base, addr = mapper.map(nproc, address) if base != addr.space: STATE.trace.create_overlay_space(base, addr.space) - brkobj.set_value('_range', addr.extend(1)) + brkobj.set_value('Range', addr.extend(1)) elif expr is not None: # Implies watchpoint try: address = int(util.parse_and_eval('&({})'.format(expr))) base, addr = mapper.map(inf, address) if base != addr.space: STATE.trace.create_overlay_space(base, addr.space) - brkobj.set_value('_range', addr.extend(width)) + brkobj.set_value('Range', addr.extend(width)) except Exception as e: print("Error: Could not get range for breakpoint: {}".format(e)) else: # I guess it's a catchpoint pass - brkobj.set_value('_expression', expr) - brkobj.set_value('_range', addr.extend(1)) - brkobj.set_value('_kinds', prot) + brkobj.set_value('Expression', expr) + brkobj.set_value('Range', addr.extend(1)) + brkobj.set_value('Kinds', prot) brkobj.set_value('Pass Count', bp.GetPassCount()) brkobj.set_value('Current Pass Count', bp.GetCurrentPassCount()) brkobj.set_value('Enabled', status) @@ -1048,10 +1050,10 @@ def put_environment(): nproc = util.selected_process() epath = ENV_PATTERN.format(procnum=nproc) envobj = STATE.trace.create_object(epath) - envobj.set_value('_debugger', 'pydbg') - envobj.set_value('_arch', arch.get_arch()) - envobj.set_value('_os', arch.get_osabi()) - envobj.set_value('_endian', arch.get_endian()) + envobj.set_value('Debugger', 'pydbg') + envobj.set_value('Arch', arch.get_arch()) + envobj.set_value('OS', arch.get_osabi()) + envobj.set_value('Endian', arch.get_endian()) envobj.insert() @@ -1081,16 +1083,13 @@ def put_regions(): keys.append(REGION_KEY_PATTERN.format(start=r.BaseAddress)) regobj = STATE.trace.create_object(rpath) (start_base, start_addr) = map_address(r.BaseAddress) - regobj.set_value('_range', start_addr.extend(r.RegionSize)) + regobj.set_value('Range', start_addr.extend(r.RegionSize)) regobj.set_value('_readable', r.Protect == None or r.Protect & 0x66 != 0) regobj.set_value('_writable', r.Protect == None or r.Protect & 0xCC != 0) regobj.set_value('_executable', r.Protect == None or r.Protect & 0xF0 != 0) - regobj.set_value('_offset', hex(r.BaseAddress)) - regobj.set_value('Base', hex(r.BaseAddress)) - regobj.set_value('Size', hex(r.RegionSize)) regobj.set_value('AllocationBase', hex(r.AllocationBase)) regobj.set_value('Protect', hex(r.Protect)) regobj.set_value('Type', hex(r.Type)) @@ -1133,14 +1132,11 @@ def put_modules(): mpath = MODULE_PATTERN.format(procnum=nproc, modpath=hbase) modobj = STATE.trace.create_object(mpath) mod_keys.append(MODULE_KEY_PATTERN.format(modpath=hbase)) - modobj.set_value('_module_name', name) base_base, base_addr = mapper.map(nproc, base) if base_base != base_addr.space: STATE.trace.create_overlay_space(base_base, base_addr.space) - modobj.set_value('_range', base_addr.extend(size)) + modobj.set_value('Range', base_addr.extend(size)) modobj.set_value('Name', name) - modobj.set_value('Base', hbase) - modobj.set_value('Size', hex(size)) modobj.set_value('Flags', hex(size)) modobj.insert() @@ -1206,7 +1202,7 @@ def put_threads(running=False): keys.append(THREAD_KEY_PATTERN.format(tnum=i)) tid = t[0] - tobj.set_value('_tid', tid) + tobj.set_value('TID', tid) tobj.set_value('_short_display', '{:x} {:x}:{:x}'.format(i, pid, tid)) tobj.set_value('_display', compute_thread_display(i, pid, tid, t)) @@ -1264,16 +1260,24 @@ def put_frames(): procnum=nproc, tnum=nthrd, level=f.FrameNumber) fobj = STATE.trace.create_object(fpath) keys.append(FRAME_KEY_PATTERN.format(level=f.FrameNumber)) - base, pc = mapper.map(nproc, f.InstructionOffset) - if base != pc.space: - STATE.trace.create_overlay_space(base, pc.space) - fobj.set_value('_pc', pc) - fobj.set_value('InstructionOffset', hex(f.InstructionOffset)) - fobj.set_value('StackOffset', hex(f.StackOffset)) - fobj.set_value('ReturnOffset', hex(f.ReturnOffset)) - fobj.set_value('FrameOffset', hex(f.FrameOffset)) + base, offset_inst = mapper.map(nproc, f.InstructionOffset) + if base != offset_inst.space: + STATE.trace.create_overlay_space(base, offset_inst.space) + base, offset_stack = mapper.map(nproc, f.StackOffset) + if base != offset_stack.space: + STATE.trace.create_overlay_space(base, offset_stack.space) + base, offset_ret = mapper.map(nproc, f.ReturnOffset) + if base != offset_ret.space: + STATE.trace.create_overlay_space(base, offset_ret.space) + base, offset_frame = mapper.map(nproc, f.FrameOffset) + if base != offset_frame.space: + STATE.trace.create_overlay_space(base, offset_frame.space) + fobj.set_value('Instruction Offset', offset_inst) + fobj.set_value('Stack Offset', offset_stack) + fobj.set_value('Return Offset', offset_ret) + fobj.set_value('Frame Offset', offset_frame) fobj.set_value('_display', "#{} {}".format( - f.FrameNumber, hex(f.InstructionOffset))) + f.FrameNumber, offset_inst.offset)) fobj.insert() STATE.trace.proxy_object_path(STACK_PATTERN.format( procnum=nproc, tnum=nthrd)).retain_values(keys) @@ -1292,21 +1296,21 @@ def ghidra_trace_put_frames(): def update_by_container(np, index, obj): if np.endswith("Processes") or np.endswith("Threads"): istate = compute_proc_state(index) - obj.set_value('_state', istate) + obj.set_value('State', istate) if np.endswith("Processes"): create_generic(obj.path) id = util.get_proc_id(index) - obj.set_value('_pid', index) + obj.set_value('PID', index) obj.set_value('_display', '{:x} {:x}'.format(id, index)) if np.endswith("Breakpoints"): create_generic(obj.path) #id = util.get_thread_id(index) - #obj.set_value('_tid', index) + #obj.set_value('TID', index) #obj.set_value('_display','{:x} {:x}'.format(id, index)) if np.endswith("Threads"): create_generic(obj.path) id = util.get_thread_id(index) - obj.set_value('_tid', index) + obj.set_value('TID', index) obj.set_value('_display', '{:x} {:x}'.format(id, index)) if np.endswith("Frames"): mo = util.get_object(obj.path) @@ -1318,7 +1322,7 @@ def update_by_container(np, index, obj): map = util.get_attributes(attr) pc = util.get_value(map["InstructionOffset"]) (pc_base, pc_addr) = map_address(pc) - obj.set_value('_pc', pc_addr) + obj.set_value('Instruction Offset', pc_addr) obj.set_value('_display', '#{:x} 0x{:x}'.format(index, pc)) if np.endswith("Modules"): create_generic(obj.path) @@ -1327,11 +1331,10 @@ def update_by_container(np, index, obj): base = util.get_value(map["BaseAddress"]) size = util.get_value(map["Size"]) name = util.get_value(map["Name"]) - obj.set_value('_module_name', '{}'.format(name)) + obj.set_value('Name', '{}'.format(name)) (base_base, base_addr) = map_address(base) - obj.set_value('_range', base_addr.extend(size)) + obj.set_value('Range', base_addr.extend(size)) obj.set_value('_display', '{:x} {:x} {}'.format(index, base, name)) - obj.set_value('Base', hex(base)) def create_generic(path): @@ -1353,10 +1356,6 @@ def put_generic(node): kind = util.get_kind(mo) type = util.get_type(mo) vstr = util.get_value(mo) - if kind is not None: - node.set_value("_kind", kind) - if type is not None: - node.set_value("_type", type.value) # print(f"MO={mo}") attributes = util.get_attributes(mo) # print(f"ATTR={attributes}") diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/hooks.py b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/hooks.py index 2a241baa05..31fa11d9ad 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/hooks.py +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/hooks.py @@ -103,8 +103,8 @@ class ProcessState(object): proc = util.selected_process() ipath = commands.PROCESS_PATTERN.format(procnum=proc) procobj = commands.STATE.trace.proxy_object_path(ipath) - procobj.set_value('_exit_code', exit_code) - procobj.set_value('_state', 'TERMINATED') + procobj.set_value('Exit Code', exit_code) + procobj.set_value('State', 'TERMINATED') class BrkState(object): diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/schema.xml b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/schema.xml index 02c9d0330f..1d40aeb01f 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/schema.xml +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidradbg/schema.xml @@ -1,31 +1,19 @@ - + + - - @@ -42,83 +30,41 @@ - - - - - - @@ -127,18 +73,13 @@ - - - - - - - @@ -423,38 +275,30 @@ - - - - + - @@ -462,40 +306,12 @@ - - - - - - - - \ No newline at end of file diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/commands.py b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/commands.py index faae4a52a1..edee2b890b 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/commands.py +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/commands.py @@ -210,8 +210,8 @@ def start_trace(name): with open(schema_fn, 'r') as schema_file: schema_xml = schema_file.read() with STATE.trace.open_tx("Create Root Object"): - root = STATE.trace.create_root_object(schema_xml, 'Session') - root.set_value('_display', 'pydbg(dbgeng) ' + util.DBG_VERSION.full) + root = STATE.trace.create_root_object(schema_xml, 'TTDSession') + root.set_value('_display', 'pyTTD ' + util.DBG_VERSION.full) util.set_convenience_variable('_ghidra_tracing', "true") @@ -915,9 +915,9 @@ def put_processes(running=False): procobj = STATE.trace.create_object(ipath) istate = compute_proc_state(p) - procobj.set_value('_state', istate) + procobj.set_value('State', istate) if running == False: - procobj.set_value('_pid', p) + procobj.set_value('PID', p) pidstr = ('0x{:x}' if radix == 16 else '0{:o}' if radix == 8 else '{}').format(p) procobj.set_value('_display', pidstr) @@ -933,13 +933,13 @@ def put_state(event_process): ipath = PROCESS_PATTERN.format(procnum=event_process) procobj = STATE.trace.create_object(ipath) state = compute_proc_state(event_process) - procobj.set_value('_state', state) + procobj.set_value('State', state) procobj.insert() tnum = util.selected_thread() if tnum is not None: ipath = THREAD_PATTERN.format(procnum=event_process, tnum=tnum) threadobj = STATE.trace.create_object(ipath) - threadobj.set_value('_state', state) + threadobj.set_value('State', state) threadobj.insert() STATE.require_tx().commit() STATE.reset_tx() @@ -974,7 +974,7 @@ def put_available(): keys.append(AVAILABLE_KEY_PATTERN.format(pid=id)) pidstr = ('0x{:x}' if radix == 16 else '0{:o}' if radix == 8 else '{}').format(id) - procobj.set_value('_pid', id) + procobj.set_value('PID', id) procobj.set_value('Name', name) procobj.set_value('_display', '{} {}'.format(pidstr, name)) procobj.insert() @@ -1008,23 +1008,22 @@ def put_single_breakpoint(bp, ibobj, nproc, ikeys): base, addr = mapper.map(nproc, address) if base != addr.space: STATE.trace.create_overlay_space(base, addr.space) - brkobj.set_value('_range', addr.extend(1)) + brkobj.set_value('Range', addr.extend(1)) elif expr is not None: # Implies watchpoint try: address = int(util.parse_and_eval('&({})'.format(expr))) base, addr = mapper.map(inf, address) if base != addr.space: STATE.trace.create_overlay_space(base, addr.space) - brkobj.set_value('_range', addr.extend(width)) + brkobj.set_value('Range', addr.extend(width)) except Exception as e: print("Error: Could not get range for breakpoint: {}\n".format(e)) else: # I guess it's a catchpoint pass - brkobj.set_value('_expression', expr) - brkobj.set_value('_range', addr.extend(1)) - brkobj.set_value('_kinds', prot) - brkobj.set_value('_enabled', status) + brkobj.set_value('Expression', expr) + brkobj.set_value('Range', addr.extend(1)) + brkobj.set_value('Kinds', prot) brkobj.set_value('Enabled', status) brkobj.set_value('Flags', prot) brkobj.insert() @@ -1062,10 +1061,10 @@ def ghidra_trace_put_breakpoints(): def put_environment(): epath = ENV_PATTERN.format(procnum=util.selected_process()) envobj = STATE.trace.create_object(epath) - envobj.set_value('_debugger', 'pyttd') - envobj.set_value('_arch', arch.get_arch()) - envobj.set_value('_os', arch.get_osabi()) - envobj.set_value('_endian', arch.get_endian()) + envobj.set_value('Debugger', 'pyttd') + envobj.set_value('Arch', arch.get_arch()) + envobj.set_value('OS', arch.get_osabi()) + envobj.set_value('Endian', arch.get_endian()) envobj.insert() @@ -1096,13 +1095,10 @@ def put_regions(): start_base, start_addr = mapper.map(nproc, m.base_addr) if start_base != start_addr.space: STATE.trace.create_overlay_space(start_base, start_addr.space) - regobj.set_value('_range', start_addr.extend(m.image_size)) + regobj.set_value('Range', start_addr.extend(m.image_size)) regobj.set_value('_readable', True) regobj.set_value('_writable', False) regobj.set_value('_executable', False) - regobj.set_value('_offset', hex(m.base_addr)) - regobj.set_value('Base', hex(m.base_addr)) - regobj.set_value('Size', hex(m.image_size)) regobj.insert() STATE.trace.proxy_object_path( MEMORY_PATTERN.format(procnum=nproc)).retain_values(keys) @@ -1139,16 +1135,13 @@ def get_module(keys, nproc: int, path, base, size): mpath = MODULE_PATTERN.format(procnum=nproc, modpath=hbase) modobj = STATE.trace.create_object(mpath) keys.append(MODULE_KEY_PATTERN.format(modpath=hbase)) - modobj.set_value('_module_name', name) mapper = STATE.trace.memory_mapper base_base, base_addr = mapper.map(nproc, base) if base_base != base_addr.space: STATE.trace.create_overlay_space(base_base, base_addr.space) - modobj.set_value('_range', base_addr.extend(size)) + modobj.set_value('Range', base_addr.extend(size)) modobj.set_value('Name', name) modobj.set_value('Path', path) - modobj.set_value('Base', hbase) - modobj.set_value('Size', hex(size)) return modobj @@ -1194,7 +1187,7 @@ def get_thread(keys, radix, pid: int, tid: int): tpath = THREAD_PATTERN.format(procnum=pid, tnum=tid) tobj = STATE.trace.create_object(tpath) keys.append(THREAD_KEY_PATTERN.format(tnum=tid)) - tobj.set_value('_tid', tid, span=Lifespan(0)) + tobj.set_value('TID', tid, span=Lifespan(0)) tidstr = ('0x{:x}' if radix == 16 else '0{:o}' if radix == 8 else '{}').format(tid) tobj.set_value('_short_display', '[{}:{}]'.format( @@ -1240,16 +1233,24 @@ def put_frames(): procnum=nproc, tnum=nthrd, level=f.FrameNumber) fobj = STATE.trace.create_object(fpath) keys.append(FRAME_KEY_PATTERN.format(level=f.FrameNumber)) - base, pc = mapper.map(nproc, f.InstructionOffset) - if base != pc.space: - STATE.trace.create_overlay_space(base, pc.space) - fobj.set_value('_pc', pc) - fobj.set_value('InstructionOffset', hex(f.InstructionOffset)) - fobj.set_value('StackOffset', hex(f.StackOffset)) - fobj.set_value('ReturnOffset', hex(f.ReturnOffset)) - fobj.set_value('FrameOffset', hex(f.FrameOffset)) + base, offset_inst = mapper.map(nproc, f.InstructionOffset) + if base != offset_inst.space: + STATE.trace.create_overlay_space(base, offset_inst.space) + base, offset_stack = mapper.map(nproc, f.StackOffset) + if base != offset_stack.space: + STATE.trace.create_overlay_space(base, offset_stack.space) + base, offset_ret = mapper.map(nproc, f.ReturnOffset) + if base != offset_ret.space: + STATE.trace.create_overlay_space(base, offset_ret.space) + base, offset_frame = mapper.map(nproc, f.FrameOffset) + if base != offset_frame.space: + STATE.trace.create_overlay_space(base, offset_frame.space) + fobj.set_value('Instruction Offset', offset_inst) + fobj.set_value('Stack Offset', offset_stack) + fobj.set_value('Return Offset', offset_ret) + fobj.set_value('Frame Offset', offset_frame) fobj.set_value('_display', "#{} {}".format( - f.FrameNumber, hex(f.InstructionOffset))) + f.FrameNumber, offset_inst.offset)) fobj.insert() STATE.trace.proxy_object_path(STACK_PATTERN.format( procnum=nproc, tnum=nthrd)).retain_values(keys) diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/hooks.py b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/hooks.py index 44147f76f6..a1028a8ddf 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/hooks.py +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/hooks.py @@ -93,7 +93,7 @@ class ProcessState(object): proc = util.selected_process() ipath = commands.PROCESS_PATTERN.format(procnum=proc) commands.STATE.trace.proxy_object_path( - ipath).set_value('_exit_code', exit_code) + ipath).set_value('Exit Code', exit_code) class BrkState(object): diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/methods.py b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/methods.py index 3c09616f5f..f96c2f5d44 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/methods.py +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/methods.py @@ -36,22 +36,22 @@ def extre(base, ext): return re.compile(base.pattern + ext) -AVAILABLE_PATTERN = re.compile(r'Available\[(?P\\d*)\]') -WATCHPOINT_PATTERN = re.compile(r'Watchpoints\[(?P\\d*)\]') -BREAKPOINT_PATTERN = re.compile(r'Breakpoints\[(?P\\d*)\]') -BREAK_LOC_PATTERN = extre(BREAKPOINT_PATTERN, r'\[(?P\\d*)\]') -PROCESS_PATTERN = re.compile(r'Processes\[(?P\\d*)\]') -PROC_BREAKS_PATTERN = extre(PROCESS_PATTERN, r'\.Breakpoints') -PROC_BREAKBPT_PATTERN = extre(PROC_BREAKS_PATTERN, r'\[(?P\\d*)\]') -ENV_PATTERN = extre(PROCESS_PATTERN, r'\.Environment') -THREADS_PATTERN = extre(PROCESS_PATTERN, r'\.Threads') -THREAD_PATTERN = extre(THREADS_PATTERN, r'\[(?P\\d*)\]') -STACK_PATTERN = extre(THREAD_PATTERN, r'\.Stack') -FRAME_PATTERN = extre(STACK_PATTERN, r'\[(?P\\d*)\]') -REGS_PATTERN0 = extre(THREAD_PATTERN, r'.Registers') -REGS_PATTERN = extre(FRAME_PATTERN, r'.Registers') -MEMORY_PATTERN = extre(PROCESS_PATTERN, r'\.Memory') -MODULES_PATTERN = extre(PROCESS_PATTERN, r'\.Modules') +AVAILABLE_PATTERN = re.compile('Available\[(?P\\d*)\]') +WATCHPOINT_PATTERN = re.compile('Watchpoints\[(?P\\d*)\]') +BREAKPOINT_PATTERN = re.compile('Breakpoints\[(?P\\d*)\]') +BREAK_LOC_PATTERN = extre(BREAKPOINT_PATTERN, '\[(?P\\d*)\]') +PROCESS_PATTERN = re.compile('Processes\[(?P\\d*)\]') +PROC_BREAKS_PATTERN = extre(PROCESS_PATTERN, '\.Breakpoints') +PROC_BREAKBPT_PATTERN = extre(PROC_BREAKS_PATTERN, '\[(?P\\d*)\]') +ENV_PATTERN = extre(PROCESS_PATTERN, '\.Environment') +THREADS_PATTERN = extre(PROCESS_PATTERN, '\.Threads') +THREAD_PATTERN = extre(THREADS_PATTERN, '\[(?P\\d*)\]') +STACK_PATTERN = extre(THREAD_PATTERN, '\.Stack') +FRAME_PATTERN = extre(STACK_PATTERN, '\[(?P\\d*)\]') +REGS_PATTERN0 = extre(THREAD_PATTERN, '.Registers') +REGS_PATTERN = extre(FRAME_PATTERN, '.Registers') +MEMORY_PATTERN = extre(PROCESS_PATTERN, '\.Memory') +MODULES_PATTERN = extre(PROCESS_PATTERN, '\.Modules') def find_availpid_by_pattern(pattern, object, err_msg): diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/schema.xml b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/schema.xml index 5a7169496d..4298c97ce1 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/schema.xml +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/schema.xml @@ -1,5 +1,5 @@ - + @@ -12,70 +12,34 @@ - - - - - @@ -84,18 +48,14 @@ - - - - - - @@ -361,77 +238,41 @@ - - - - + - - - - - - - - - \ No newline at end of file diff --git a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/util.py b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/util.py index 5a3d4ef5ba..2b6cec60d5 100644 --- a/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/util.py +++ b/Ghidra/Debug/Debugger-agent-dbgeng/src/main/py/src/ghidrattd/util.py @@ -51,7 +51,7 @@ class Watchpoint(object): def _compute_pydbg_ver(): - blurb = "" # base._control.GetActualProcessorType() + blurb = "" #get_debugger()._control.GetActualProcessorType() full = "" major = 0 minor = 0 diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModule.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModule.java index 56ac58112b..8a35ffd10b 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModule.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetModule.java @@ -40,7 +40,7 @@ import ghidra.program.model.address.*; public class GdbModelTargetModule extends DefaultTargetObject implements TargetModule { - public static final String VISIBLE_RANGE_ATTRIBUTE_NAME = "range"; + public static final String VISIBLE_RANGE_ATTRIBUTE_NAME = "Range"; public static final String VISIBLE_MODULE_NAME_ATTRIBUTE_NAME = "module name"; protected static String indexModule(GdbModule module) { diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSection.java b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSection.java index fcfae1180b..216d5e8859 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSection.java +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/java/agent/gdb/model/impl/GdbModelTargetSection.java @@ -35,7 +35,7 @@ import ghidra.program.model.address.*; public class GdbModelTargetSection extends DefaultTargetObject implements TargetSection { - public static final String VISIBLE_RANGE_ATTRIBUTE_NAME = "range"; + public static final String VISIBLE_RANGE_ATTRIBUTE_NAME = "Range"; protected static String indexSection(GdbModuleSection section) { return section.getName(); diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py index 07920515cc..51700fa3ea 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py @@ -50,8 +50,6 @@ STACK_PATTERN = THREAD_PATTERN + '.Stack' FRAME_KEY_PATTERN = '[{level}]' FRAME_PATTERN = STACK_PATTERN + FRAME_KEY_PATTERN REGS_PATTERN = FRAME_PATTERN + '.Registers' -REG_KEY_PATTERN = '[{regname}]' -REG_PATTERN = REGS_PATTERN + REG_KEY_PATTERN MEMORY_PATTERN = INFERIOR_PATTERN + '.Memory' REGION_KEY_PATTERN = '[{start:08x}]' REGION_PATTERN = MEMORY_PATTERN + REGION_KEY_PATTERN @@ -592,20 +590,14 @@ def putreg(frame, reg_descs): cobj = STATE.trace.create_object(space) cobj.insert() mapper = STATE.trace.register_mapper - keys = [] values = [] + endian = arch.get_endian() for desc in reg_descs: v = frame.read_register(desc.name) rv = mapper.map_value(inf, desc.name, v) values.append(rv) - # TODO: Key by gdb's name or mapped name? I think gdb's. - rpath = REG_PATTERN.format(infnum=inf.num, tnum=gdb.selected_thread( - ).num, level=util.get_level(frame), regname=desc.name) - keys.append(REG_KEY_PATTERN.format(regname=desc.name)) - robj = STATE.trace.create_object(rpath) - robj.set_value('_value', rv.value) - robj.insert() - cobj.retain_values(keys) + value = hex(int.from_bytes(rv.value, endian)) + cobj.set_value(desc.name, str(value)) # TODO: Memorize registers that failed for this arch, and omit later. missing = STATE.trace.put_registers(space, values) return {'missing': missing} @@ -1018,11 +1010,11 @@ def put_inferior_state(inf): ipath = INFERIOR_PATTERN.format(infnum=inf.num) infobj = STATE.trace.proxy_object_path(ipath) istate = compute_inf_state(inf) - infobj.set_value('_state', istate) + infobj.set_value('State', istate) for t in inf.threads(): tpath = THREAD_PATTERN.format(infnum=inf.num, tnum=t.num) tobj = STATE.trace.proxy_object_path(tpath) - tobj.set_value('_state', convert_state(t)) + tobj.set_value('State', convert_state(t)) def put_inferiors(): @@ -1034,7 +1026,7 @@ def put_inferiors(): keys.append(INFERIOR_KEY_PATTERN.format(infnum=inf.num)) infobj = STATE.trace.create_object(ipath) istate = compute_inf_state(inf) - infobj.set_value('_state', istate) + infobj.set_value('State', istate) infobj.insert() STATE.trace.proxy_object_path(INFERIORS_PATH).retain_values(keys) @@ -1060,7 +1052,7 @@ def put_available(): ppath = AVAILABLE_PATTERN.format(pid=proc.pid) procobj = STATE.trace.create_object(ppath) keys.append(AVAILABLE_KEY_PATTERN.format(pid=proc.pid)) - procobj.set_value('_pid', proc.pid) + procobj.set_value('PID', proc.pid) procobj.set_value('_display', '{} {}'.format(proc.pid, proc.name())) procobj.insert() STATE.trace.proxy_object_path(AVAILABLES_PATH).retain_values(keys) @@ -1082,28 +1074,28 @@ def put_single_breakpoint(b, ibobj, inf, ikeys): mapper = STATE.trace.memory_mapper bpath = BREAKPOINT_PATTERN.format(breaknum=b.number) brkobj = STATE.trace.create_object(bpath) - brkobj.set_value('_enabled', b.enabled) + brkobj.set_value('Enabled', b.enabled) if b.type == gdb.BP_BREAKPOINT: - brkobj.set_value('_expression', b.location) - brkobj.set_value('_kinds', 'SW_EXECUTE') + brkobj.set_value('Expression', b.location) + brkobj.set_value('Kinds', 'SW_EXECUTE') elif b.type == gdb.BP_HARDWARE_BREAKPOINT: - brkobj.set_value('_expression', b.location) - brkobj.set_value('_kinds', 'HW_EXECUTE') + brkobj.set_value('Expression', b.location) + brkobj.set_value('Kinds', 'HW_EXECUTE') elif b.type == gdb.BP_WATCHPOINT: - brkobj.set_value('_expression', b.expression) - brkobj.set_value('_kinds', 'WRITE') + brkobj.set_value('Expression', b.expression) + brkobj.set_value('Kinds', 'WRITE') elif b.type == gdb.BP_HARDWARE_WATCHPOINT: - brkobj.set_value('_expression', b.expression) - brkobj.set_value('_kinds', 'WRITE') + brkobj.set_value('Expression', b.expression) + brkobj.set_value('Kinds', 'WRITE') elif b.type == gdb.BP_READ_WATCHPOINT: - brkobj.set_value('_expression', b.expression) - brkobj.set_value('_kinds', 'READ') + brkobj.set_value('Expression', b.expression) + brkobj.set_value('Kinds', 'READ') elif b.type == gdb.BP_ACCESS_WATCHPOINT: - brkobj.set_value('_expression', b.expression) - brkobj.set_value('_kinds', 'READ,WRITE') + brkobj.set_value('Expression', b.expression) + brkobj.set_value('Kinds', 'READ,WRITE') else: - brkobj.set_value('_expression', '(unknown)') - brkobj.set_value('_kinds', '') + brkobj.set_value('Expression', '(unknown)') + brkobj.set_value('Kinds', '') brkobj.set_value('Commands', b.commands) brkobj.set_value('Condition', b.condition) brkobj.set_value('Hit Count', b.hit_count) @@ -1122,14 +1114,14 @@ def put_single_breakpoint(b, ibobj, inf, ikeys): if inf.num not in l.thread_groups: continue locobj = STATE.trace.create_object(bpath + k) - locobj.set_value('_enabled', l.enabled) + locobj.set_value('Enabled', l.enabled) ik = INF_BREAK_KEY_PATTERN.format(breaknum=b.number, locnum=i+1) ikeys.append(ik) if b.location is not None: # Implies execution break base, addr = mapper.map(inf, l.address) if base != addr.space: STATE.trace.create_overlay_space(base, addr.space) - locobj.set_value('_range', addr.extend(1)) + locobj.set_value('Range', addr.extend(1)) elif b.expression is not None: # Implies watchpoint expr = b.expression if expr.startswith('-location '): @@ -1141,7 +1133,7 @@ def put_single_breakpoint(b, ibobj, inf, ikeys): STATE.trace.create_overlay_space(base, addr.space) size = int(gdb.parse_and_eval( 'sizeof({})'.format(expr))) - locobj.set_value('_range', addr.extend(size)) + locobj.set_value('Range', addr.extend(size)) except Exception as e: gdb.write("Error: Could not get range for breakpoint {}: {}\n".format( ik, e), stream=gdb.STDERR) @@ -1183,10 +1175,11 @@ def put_environment(): inf = gdb.selected_inferior() epath = ENV_PATTERN.format(infnum=inf.num) envobj = STATE.trace.create_object(epath) - envobj.set_value('_debugger', 'gdb') - envobj.set_value('_arch', arch.get_arch()) - envobj.set_value('_os', arch.get_osabi()) - envobj.set_value('_endian', arch.get_endian()) + envobj.set_value('Debugger', 'gdb') + envobj.set_value('Arch', arch.get_arch()) + envobj.set_value('OS', arch.get_osabi()) + envobj.set_value('Endian', arch.get_endian()) + envobj.insert() @cmd('ghidra trace put-environment', '-ghidra-trace-put-environment', @@ -1218,12 +1211,14 @@ def put_regions(): start_base, start_addr = mapper.map(inf, r.start) if start_base != start_addr.space: STATE.trace.create_overlay_space(start_base, start_addr.space) - regobj.set_value('_range', start_addr.extend(r.end - r.start)) + regobj.set_value('Range', start_addr.extend(r.end - r.start)) + if r.perms != None: + regobj.set_value('Permissions', r.perms) regobj.set_value('_readable', r.perms == None or 'r' in r.perms) regobj.set_value('_writable', r.perms == None or 'w' in r.perms) regobj.set_value('_executable', r.perms == None or 'x' in r.perms) - regobj.set_value('_offset', r.offset) - regobj.set_value('_objfile', r.objfile) + regobj.set_value('Offset', hex(r.offset)) + regobj.set_value('Object File', r.objfile) regobj.set_value('_display', f'{r.objfile} (0x{r.start:x}-0x{r.end:x})') regobj.insert() STATE.trace.proxy_object_path( @@ -1252,11 +1247,11 @@ def put_modules(modules=None, sections=False): mpath = MODULE_PATTERN.format(infnum=inf.num, modpath=mk) modobj = STATE.trace.create_object(mpath) mod_keys.append(MODULE_KEY_PATTERN.format(modpath=mk)) - modobj.set_value('_module_name', m.name) + modobj.set_value('Name', m.name) base_base, base_addr = mapper.map(inf, m.base) if base_base != base_addr.space: STATE.trace.create_overlay_space(base_base, base_addr.space) - modobj.set_value('_range', base_addr.extend(m.max - m.base)) + modobj.set_value('Range', base_addr.extend(m.max - m.base)) if sections: sec_keys = [] for sk, s in m.sections.items(): @@ -1267,9 +1262,9 @@ def put_modules(modules=None, sections=False): if start_base != start_addr.space: STATE.trace.create_overlay_space( start_base, start_addr.space) - secobj.set_value('_range', start_addr.extend(s.end - s.start)) - secobj.set_value('_offset', s.offset) - secobj.set_value('_attrs', s.attrs, schema=sch.STRING_ARR) + secobj.set_value('Range', start_addr.extend(s.end - s.start)) + secobj.set_value('Offset', hex(s.offset)) + secobj.set_value('Attrs', s.attrs, schema=sch.STRING_ARR) secobj.insert() STATE.trace.proxy_object_path( mpath + SECTIONS_ADD_PATTERN).retain_values(sec_keys) @@ -1357,10 +1352,10 @@ def put_threads(): tpath = THREAD_PATTERN.format(infnum=inf.num, tnum=t.num) tobj = STATE.trace.create_object(tpath) keys.append(THREAD_KEY_PATTERN.format(tnum=t.num)) - tobj.set_value('_state', convert_state(t)) - tobj.set_value('_name', t.name) + tobj.set_value('State', convert_state(t)) + tobj.set_value('Name', t.name) tid = convert_tid(t.ptid) - tobj.set_value('_tid', tid) + tobj.set_value('TID', tid) tidstr = ('0x{:x}' if radix == 16 else '0{:o}' if radix == 8 else '{}').format(tid) tobj.set_value('_short_display', '[{}.{}:{}]'.format( @@ -1413,8 +1408,8 @@ def put_frames(): base, pc = mapper.map(inf, f.pc()) if base != pc.space: STATE.trace.create_overlay_space(base, pc.space) - fobj.set_value('_pc', pc) - fobj.set_value('_func', str(f.function())) + fobj.set_value('PC', pc) + fobj.set_value('Function', str(f.function())) fobj.set_value( '_display', bt[level].strip().replace('\\s+', ' ')) f = f.older() diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/hooks.py b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/hooks.py index 060318dcd3..39377afdb9 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/hooks.py +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/hooks.py @@ -117,8 +117,8 @@ class InferiorState(object): inf = gdb.selected_inferior() ipath = commands.INFERIOR_PATTERN.format(infnum=inf.num) infobj = commands.STATE.trace.proxy_object_path(ipath) - infobj.set_value('_exit_code', exit_code) - infobj.set_value('_state', 'TERMINATED') + infobj.set_value('Exit Code', exit_code) + infobj.set_value('State', 'TERMINATED') class BrkState(object): diff --git a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/schema.xml b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/schema.xml index 936fa76b7c..4104c3a08d 100644 --- a/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/schema.xml +++ b/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/schema.xml @@ -13,69 +13,33 @@ -