NationalSecurityAgency/ghidra · error · RuntimeError
No register mapper
Error message
No register mapper
What it means
Thrown as a RuntimeError by Extra.require_rm() in the gdb agent when the register_mapper attribute has not been set (is None). Analogous to error 172 but for register translation. The register_mapper is assigned during start_trace from arch.compute_register_mapper(language).
Source
Thrown at Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py:85
MODULE_PATTERN = MODULES_PATTERN + MODULE_KEY_PATTERN
SECTIONS_ADD_PATTERN = '.Sections'
SECTION_KEY_PATTERN = '[{secname}]'
SECTION_ADD_PATTERN = SECTIONS_ADD_PATTERN + SECTION_KEY_PATTERN
class Extra(object):
def __init__(self) -> None:
self.memory_mapper: Optional[arch.DefaultMemoryMapper] = None
self.register_mapper: Optional[arch.DefaultRegisterMapper] = None
def require_mm(self) -> arch.DefaultMemoryMapper:
if self.memory_mapper is None:
raise RuntimeError("No memory mapper")
return self.memory_mapper
def require_rm(self) -> arch.DefaultRegisterMapper:
if self.register_mapper is None:
raise RuntimeError("No register mapper")
return self.register_mapper
class State(object):
def __init__(self) -> None:
self.reset_client()
def require_client(self) -> Client:
if self.client is None:
raise gdb.GdbError("Not connected")
return self.client
def require_no_client(self) -> None:
if self.client is not None:
raise gdb.GdbError("Already connected")
def reset_client(self) -> None:View on GitHub (pinned to d5f144c24d)
Solutions
- Call ghidra_trace_start successfully before any register-related command.
- Verify STATE.trace.extra.register_mapper is not None before calling require_rm().
- After ghidra_trace_disconnect, call ghidra_trace_start again before register operations.
Example fix
// before
ghidra_trace_connect('127.0.0.1:12345')
ghidra_trace_get_register('rax') # fails: no trace started
// after
ghidra_trace_connect('127.0.0.1:12345')
ghidra_trace_start('myprogram')
ghidra_trace_get_register('rax') Defensive patterns
Strategy: validation
Validate before calling
def ensure_register_mapper() -> arch.DefaultRegisterMapper:
if STATE.trace is None:
raise RuntimeError('No active trace. Call ghidra_trace_start first.')
rm = STATE.trace.extra.register_mapper
if rm is None:
raise RuntimeError('Register mapper not initialized. Trace may have failed to start.')
return rm Type guard
def has_register_mapper() -> bool:
return (
STATE.trace is not None
and STATE.trace.extra is not None
and STATE.trace.extra.register_mapper is not None
) Try / catch
try:
STATE.trace.extra.require_rm()
except RuntimeError as e:
if 'No register mapper' in str(e):
ghidra_trace_start() # reinitialize trace
raise Prevention
- Always call ghidra_trace_start before any register command.
- After disconnect/reconnect, re-run ghidra_trace_start.
- Check STATE.trace.extra.register_mapper for None before use.
When it happens
Trigger: Calling any command that reads or writes registers before ghidra_trace_start has been called, or after the trace was reset. The require_rm() accessor checks for None and raises.
Common situations: Issuing register-read commands before starting the trace; trace initialization failed at create_trace before register_mapper assignment; disconnect and reconnect without re-starting the trace.
Related errors
- No memory mapper
- Inferiors[{infnum}] does not exist
- Cannot emulate a trace unless it's opened in the tool.
- Static program is not opened
- Trace is not opened in this tool
AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14).
Data as JSON: /api/errors/071726c4ca33a4fe.
Report an issue: GitHub.