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 @@
-
-
-
-
-
-
-
-
+
+
+
+
-
-
-
+
+
@@ -153,14 +94,10 @@
-
-
-
+
+
-
-
-
@@ -180,107 +117,67 @@
-
+
+
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -302,16 +199,13 @@
-
-
-
-
-
+
+
+
+
-
-
@@ -320,102 +214,60 @@
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -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 @@
-
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
@@ -109,14 +69,10 @@
-
-
-
+
+
-
-
-
@@ -136,105 +92,66 @@
-
+
+
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -254,16 +171,13 @@
-
-
-
-
-
+
+
+
+
-
-
@@ -272,88 +186,51 @@
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -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 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -83,16 +47,12 @@
-
-
-
-
-
+
+
+
+
-
-
-
@@ -106,14 +66,10 @@
-
-
-
+
+
-
-
-
@@ -132,105 +88,66 @@
-
+
+
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -249,16 +166,13 @@
-
-
-
-
-
+
+
+
+
-
-
@@ -266,88 +180,53 @@
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
+
+
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -355,61 +234,30 @@
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
-
-
-
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py
index d57987601d..0af5bd08b0 100644
--- a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py
+++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py
@@ -1410,7 +1410,7 @@ def put_processes():
keys.append(PROCESS_KEY_PATTERN.format(procnum=proc.GetProcessID()))
procobj = STATE.trace.create_object(ipath)
istate = compute_proc_state(proc)
- procobj.set_value('_state', istate)
+ procobj.set_value('State', istate)
procobj.insert()
STATE.trace.proxy_object_path(PROCESSES_PATH).retain_values(keys)
@@ -1421,7 +1421,7 @@ def put_state(event_process):
with STATE.require_trace().open_tx('State'):
procobj = STATE.trace.create_object(ipath)
state = "STOPPED" if event_process.is_stopped else "RUNNING"
- procobj.set_value('_state', state)
+ procobj.set_value('State', state)
procobj.insert()
@@ -1448,8 +1448,8 @@ 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('_display', f'{proc.pid} {proc.name}')
+ procobj.set_value('PID', proc.pid)
+ procobj.set_value('_display', f'{proc.pid} {proc.name()}')
procobj.insert()
STATE.trace.proxy_object_path(AVAILABLES_PATH).retain_values(keys)
@@ -1476,11 +1476,11 @@ def put_single_breakpoint(b, ibobj, proc, ikeys):
bpath = BREAKPOINT_PATTERN.format(breaknum=b.GetID())
brkobj = STATE.trace.create_object(bpath)
if b.IsHardware():
- brkobj.set_value('_expression', util.get_description(b))
- brkobj.set_value('_kinds', 'HW_EXECUTE')
+ brkobj.set_value('Expression', util.get_description(b))
+ brkobj.set_value('Kinds', 'HW_EXECUTE')
else:
- brkobj.set_value('_expression', util.get_description(b))
- brkobj.set_value('_kinds', 'SW_EXECUTE')
+ brkobj.set_value('Expression', util.get_description(b))
+ brkobj.set_value('Kinds', 'SW_EXECUTE')
cmdList = lldb.SBStringList()
if b.GetCommandLineCommands(cmdList):
list = []
@@ -1507,7 +1507,7 @@ def put_single_breakpoint(b, ibobj, proc, ikeys):
base, addr = mapper.map(proc, l.GetLoadAddress())
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))
locobj.set_value('Enabled', l.IsEnabled())
else: # I guess it's a catchpoint
pass
@@ -1523,16 +1523,16 @@ def put_single_watchpoint(b, ibobj, proc, ikeys):
procnum=proc.GetProcessID(), watchnum=b.GetID())
brkobj = STATE.trace.create_object(bpath)
desc = util.get_description(b, level=0)
- brkobj.set_value('_expression', desc)
- brkobj.set_value('_kinds', 'WRITE')
+ brkobj.set_value('Expression', desc)
+ brkobj.set_value('Kinds', 'WRITE')
if "type = r" in desc:
- brkobj.set_value('_kinds', 'READ')
+ brkobj.set_value('Kinds', 'READ')
if "type = rw" in desc:
- brkobj.set_value('_kinds', 'READ,WRITE')
+ brkobj.set_value('Kinds', 'READ,WRITE')
base, addr = mapper.map(proc, b.GetWatchAddress())
if base != addr.space:
STATE.trace.create_overlay_space(base, addr.space)
- brkobj.set_value('_range', addr.extend(b.GetWatchSize()))
+ brkobj.set_value('Range', addr.extend(b.GetWatchSize()))
if b.GetCondition():
brkobj.set_value('Condition', b.GetCondition())
brkobj.set_value('Hit Count', b.GetHitCount())
@@ -1613,10 +1613,10 @@ def put_environment():
proc = util.get_process()
epath = ENV_PATTERN.format(procnum=proc.GetProcessID())
envobj = STATE.trace.create_object(epath)
- envobj.set_value('_debugger', 'lldb')
- 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', 'lldb')
+ envobj.set_value('Arch', arch.get_arch())
+ envobj.set_value('OS', arch.get_osabi())
+ envobj.set_value('Endian', arch.get_endian())
envobj.insert()
@@ -1655,12 +1655,14 @@ def put_regions():
start_base, start_addr = mapper.map(proc, 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.insert()
STATE.trace.proxy_object_path(
MEMORY_PATTERN.format(procnum=proc.GetProcessID())).retain_values(keys)
@@ -1693,12 +1695,12 @@ def put_modules():
mpath = MODULE_PATTERN.format(procnum=proc.GetProcessID(), 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(proc, m.base)
if base_base != base_addr.space:
STATE.trace.create_overlay_space(base_base, base_addr.space)
if m.max > m.base:
- modobj.set_value('_range', base_addr.extend(m.max - m.base + 1))
+ modobj.set_value('Range', base_addr.extend(m.max - m.base + 1))
sec_keys = []
for sk, s in m.sections.items():
spath = mpath + SECTION_ADD_PATTERN.format(secname=sk)
@@ -1708,9 +1710,9 @@ def put_modules():
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 + 1))
- secobj.set_value('_offset', s.offset)
- secobj.set_value('_attrs', s.attrs)
+ secobj.set_value('Range', start_addr.extend(s.end - s.start + 1))
+ secobj.set_value('Offset', hex(s.offset))
+ secobj.set_value('Attrs', s.attrs)
secobj.insert()
# In case there are no sections, we must still insert the module
modobj.insert()
@@ -1774,11 +1776,10 @@ def put_threads():
procnum=proc.GetProcessID(), tnum=t.GetThreadID())
tobj = STATE.trace.create_object(tpath)
keys.append(THREAD_KEY_PATTERN.format(tnum=t.GetThreadID()))
- #tobj.set_value('_state', convert_state(t))
- tobj.set_value('_state', compute_proc_state(proc))
- tobj.set_value('_name', t.GetName())
+ tobj.set_value('State', compute_proc_state(proc))
+ tobj.set_value('Name', t.GetName())
tid = t.GetThreadID()
- tobj.set_value('_tid', tid)
+ tobj.set_value('TID', tid)
tidstr = f'0x{tid:x}' if radix == 16 else f'0{tid:o}' if radix == 8 else f'{tid}'
tobj.set_value('_short_display',
f'[{proc.GetProcessID()}.{t.GetThreadID()}:{tidstr}]')
@@ -1834,8 +1835,8 @@ def put_frames():
base, pc = mapper.map(proc, f.GetPC())
if base != pc.space:
STATE.trace.create_overlay_space(base, pc.space)
- fobj.set_value('_pc', pc)
- fobj.set_value('_func', str(f.GetFunctionName()))
+ fobj.set_value('PC', pc)
+ fobj.set_value('Function', str(f.GetFunctionName()))
fobj.set_value('_display', util.get_description(f))
fobj.insert()
STATE.trace.proxy_object_path(STACK_PATTERN.format(
diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/hooks.py b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/hooks.py
index b635cb94e1..dd03897d73 100644
--- a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/hooks.py
+++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/hooks.py
@@ -105,8 +105,9 @@ class ProcessState(object):
def record_exited(self, exit_code):
proc = util.get_process()
ipath = commands.PROCESS_PATTERN.format(procnum=proc.GetProcessID())
- commands.STATE.trace.proxy_object_path(
- ipath).set_value('_exit_code', exit_code)
+ procobj = commands.STATE.trace.proxy_object_path(ipath)
+ procobj.set_value('Exit Code', exit_code)
+ procobj.set_value('State', 'TERMINATED')
class BrkState(object):
diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/methods.py b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/methods.py
index 669f0f062a..f769814431 100644
--- a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/methods.py
+++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/methods.py
@@ -460,7 +460,7 @@ def _continue(process: sch.Schema('Process')):
@REGISTRY.method
-def interrupt():
+def interrupt(process: sch.Schema('Process')):
"""Interrupt the execution of the debugged program."""
exec_convert_errors('process interrupt')
# util.get_process().SendAsyncInterrupt()
diff --git a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/schema.xml b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/schema.xml
index 1ae6a354ac..e4fe8a3fef 100644
--- a/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/schema.xml
+++ b/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/schema.xml
@@ -14,81 +14,38 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -96,16 +53,12 @@
-
-
-
-
-
+
+
+
+
-
-
-
@@ -121,19 +74,16 @@
-
-
-
-
-
+
+
+
+
-
-
-
-
+
+
@@ -142,14 +92,10 @@
-
-
-
+
+
-
-
-
@@ -169,80 +115,54 @@
-
+
+
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
-
@@ -250,26 +170,13 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -288,16 +195,14 @@
-
-
-
-
-
+
+
+
+
+
-
-
@@ -306,88 +211,51 @@
-
-
-
-
-
-
+
+
+
+
-
-
-
-
-
+
+
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -395,39 +263,30 @@
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
+
-
@@ -435,40 +294,12 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file