NationalSecurityAgency/ghidra · error · RuntimeError
No memory mapper
Error message
No memory mapper
What it means
Raised by Extra.require_mm in the Ghidra LLDB agent when memory_mapper has not been set on the trace's Extra object. The memory mapper translates between Ghidra addresses and target offsets; without it, memory-related trace operations cannot proceed. RuntimeError signals a missing precondition — the mapper must be computed (compute_memory_mapper) and assigned before any memory operation is invoked.
Source
Thrown at Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py:82
MEMORY_PATTERN = PROCESS_PATTERN + '.Memory'
REGION_KEY_PATTERN = '[{start:08x}]'
REGION_PATTERN = MEMORY_PATTERN + REGION_KEY_PATTERN
MODULES_PATTERN = PROCESS_PATTERN + '.Modules'
MODULE_KEY_PATTERN = '[{modpath}]'
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 RuntimeError("Not connected")
return self.client
View on GitHub (pinned to d5f144c24d)
Solutions
- Ensure the trace-activate/environment step (which sets trace.extra.memory_mapper = compute_memory_mapper(lang)) runs to completion before any memory method.
- Lazily initialize the mapper inside require_mm: if None, assign compute_memory_mapper(current_lang) before returning.
- Order commands so memory operations occur only after target launch and arch detection.
- Add a startup self-check that asserts memory_mapper is set after activate.
Example fix
// before
offset = trace.extra.require_mm().map_back(proc, address)
// after
extra = trace.extra
if extra.memory_mapper is None:
extra.memory_mapper = arch.compute_memory_mapper(current_lang)
offset = extra.require_mm().map_back(proc, address) Defensive patterns
Strategy: validation
Validate before calling
extra = trace.extra
if extra.memory_mapper is None:
extra.memory_mapper = arch.compute_memory_mapper(current_lang)
offset = extra.require_mm().map_back(proc, address) Type guard
def memory_mapper_ready(extra) -> bool:
return extra.memory_mapper is not None Try / catch
try:
mm = trace.extra.require_mm()
except RuntimeError:
# mapper not initialized; initialize then retry
trace.extra.memory_mapper = arch.compute_memory_mapper(current_lang)
mm = trace.extra.require_mm() Prevention
- ensure activate/environment step sets memory_mapper before any memory command
- lazily initialize the mapper in require_mm
- self-check that memory_mapper is set after activate
When it happens
Trigger: Calling trace.extra.require_mm() before the agent initialized memory_mapper — e.g. a memory command/method ran during trace startup before compute_memory_mapper completed, or the mapper was never assigned for the target language. Reached by ~15 commands/methods (putmem, getmem, mem region emission, etc.).
Common situations: Trace started but the environment/activate step that sets memory_mapper did not run (e.g. target not yet launched, or arch detection failed silently); language with no registered mapper where the init code path was skipped; ordering bug where a memory method fires before 'activate'.
Related errors
AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14).
Data as JSON: /api/errors/01d3c9736a030d75.
Report an issue: GitHub.