{"record":{"id":"cab3dbda9bdab6b6","repo":"NationalSecurityAgency/ghidra","slug":"no-register-mapper-cab3db","errorCode":null,"errorMessage":"No register mapper","messagePattern":"No register mapper","errorType":"validation","errorClass":"RuntimeError","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py","lineNumber":87,"sourceCode":"MODULE_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 RuntimeError(\"Not connected\")\n        return self.client\n\n    def require_no_client(self) -> None:\n        if self.client is not None:\n            raise RuntimeError(\"Already connected\")\n\n    def reset_client(self) -> None:","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Debugger-agent-lldb/src/main/py/src/ghidralldb/commands.py#L69-L105","documentation":"Raised by Extra.require_rm in the Ghidra LLDB agent when register_mapper has not been set on the trace's Extra object. The register mapper translates register names and byte values between Ghidra and LLDB; without it, register read/write trace operations cannot proceed. RuntimeError signals a missing precondition — the mapper must be constructed (DefaultRegisterMapper with valid byte_order) and assigned before any register operation.","triggerScenarios":"Calling trace.extra.require_rm() before the agent initialized register_mapper — e.g. a register method fired during startup before the register mapper was assigned, or arch/endianness detection failed and the assignment was skipped. Reached by methods that read/translate register values.","commonSituations":"Trace-activate step that sets register_mapper did not complete (target not launched, arch detection failed); endianness detection returned an invalid value causing mapper construction to be skipped; ordering bug where a register method runs before activate.","solutions":["Ensure the activate/environment step assigns trace.extra.register_mapper (with a validated byte_order) before any register method runs.","Lazily initialize register_mapper in require_rm using the detected endianness.","Order commands so register operations occur only after target launch and arch/endianness detection.","Verify byte_order normalization (see error 191) so mapper construction does not silently fail."],"exampleFix":"// before\nrv = frame.trace.extra.require_rm().map_value_back(proc, name, value)\n// after\nextra = frame.trace.extra\nif extra.register_mapper is None:\n    extra.register_mapper = arch.DefaultRegisterMapper(normalized_byte_order)\nrv = extra.require_rm().map_value_back(proc, name, value)","handlingStrategy":"validation","validationCode":"extra = trace.extra\nif extra.register_mapper is None:\n    extra.register_mapper = arch.DefaultRegisterMapper(normalized_byte_order)\nrv = extra.require_rm().map_value_back(proc, name, value)","typeGuard":"def register_mapper_ready(extra) -> bool:\n    return extra.register_mapper is not None","tryCatchPattern":"try:\n    rm = trace.extra.require_rm()\nexcept RuntimeError:\n    trace.extra.register_mapper = arch.DefaultRegisterMapper(detected_endianness())\n    rm = trace.extra.require_rm()","preventionTips":["ensure activate sets register_mapper with validated byte_order","lazily initialize register_mapper in require_rm","verify endianness detection does not return an invalid value"],"tags":["ghidra","lldb","runtime-error","state-machine","registers"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}