{"record":{"id":"5724da1b84b62688","repo":"NationalSecurityAgency/ghidra","slug":"no-memory-mapper-5724da","errorCode":null,"errorMessage":"No memory mapper","messagePattern":"No memory mapper","errorType":"exception","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py","lineNumber":80,"sourceCode":"MEMORY_PATTERN = INFERIOR_PATTERN + '.Memory'\nREGION_KEY_PATTERN = '[{start:08x}]'\nREGION_PATTERN = MEMORY_PATTERN + REGION_KEY_PATTERN\nMODULES_PATTERN = INFERIOR_PATTERN + '.Modules'\nMODULE_KEY_PATTERN = '[{modpath}]'\nMODULE_PATTERN = MODULES_PATTERN + MODULE_KEY_PATTERN\nSECTIONS_ADD_PATTERN = '.Sections'\nSECTION_KEY_PATTERN = '[{secname}]'\nSECTION_ADD_PATTERN = SECTIONS_ADD_PATTERN + SECTION_KEY_PATTERN\n\n\nclass Extra(object):\n    def __init__(self) -> None:\n        self.memory_mapper: Optional[arch.DefaultMemoryMapper] = None\n        self.register_mapper: Optional[arch.DefaultRegisterMapper] = None\n\n    def require_mm(self) -> arch.DefaultMemoryMapper:\n        if self.memory_mapper is None:\n            raise RuntimeError(\"No memory mapper\")\n        return self.memory_mapper\n\n    def require_rm(self) -> arch.DefaultRegisterMapper:\n        if self.register_mapper is None:\n            raise RuntimeError(\"No register mapper\")\n        return self.register_mapper\n\n\nclass State(object):\n\n    def __init__(self) -> None:\n        self.reset_client()\n\n    def require_client(self) -> Client:\n        if self.client is None:\n            raise gdb.GdbError(\"Not connected\")\n        return self.client\n","sourceCodeStart":62,"sourceCodeEnd":98,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Debugger-agent-gdb/src/main/py/src/ghidragdb/commands.py#L62-L98","documentation":"Thrown as a RuntimeError by Extra.require_mm() in the gdb agent when the memory_mapper attribute has not been set (is None). The Extra object is created during start_trace and its memory_mapper is assigned from arch.compute_memory_mapper(language); if start_trace was not called or failed before the assignment, this fires.","triggerScenarios":"Calling any command that needs memory translation (putmem, getmem, set-value with pointers) before ghidra_trace_start has been called, or after STATE.reset_client() cleared the trace. The require_mm() accessor checks for None and raises.","commonSituations":"Forgetting to call ghidra_trace_start before issuing memory commands; trace was started but create_trace failed, leaving memory_mapper unset; the Extra object was reused or reset incorrectly.","solutions":["Call ghidra_trace_start (or ensure start_trace completed successfully) before any memory-related command.","Verify STATE.trace is not None and STATE.trace.extra.memory_mapper is set before calling require_mm().","If the trace was disconnected, call ghidra_trace_start again to reinitialize."],"exampleFix":"// before\nghidra_trace_connect('127.0.0.1:12345')\nghidra_trace_putmem('0x400000', 16)  # fails: no trace started\n// after\nghidra_trace_connect('127.0.0.1:12345')\nghidra_trace_start('myprogram')\nghidra_trace_putmem('0x400000', 16)","handlingStrategy":"validation","validationCode":"def ensure_memory_mapper() -> arch.DefaultMemoryMapper:\n    if STATE.trace is None:\n        raise RuntimeError('No active trace. Call ghidra_trace_start first.')\n    mm = STATE.trace.extra.memory_mapper\n    if mm is None:\n        raise RuntimeError('Memory mapper not initialized. Trace may have failed to start.')\n    return mm","typeGuard":"def has_memory_mapper() -> bool:\n    return (\n        STATE.trace is not None\n        and STATE.trace.extra is not None\n        and STATE.trace.extra.memory_mapper is not None\n    )","tryCatchPattern":"try:\n    STATE.trace.extra.require_mm()\nexcept RuntimeError as e:\n    if 'No memory mapper' in str(e):\n        ghidra_trace_start()  # reinitialize trace\n    raise","preventionTips":["Always call ghidra_trace_start before any memory command.","After disconnect/reconnect, re-run ghidra_trace_start.","Check STATE.trace and STATE.trace.extra.memory_mapper for None before use."],"tags":["gdb","lifecycle","memory-mapping","initialization"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}