NationalSecurityAgency/ghidra · error · RuntimeError

No register mapper

Error message

No register mapper

What it means

Raised by Extra.require_rm when the trace's register_mapper has not been set. The register mapper translates between Ghidra register values and x64dbg register formats; it is initialized during start_trace via compute_register_mapper. Any register operation calling require_rm before start_trace completes will trigger this.

Source

Thrown at Ghidra/Debug/Debugger-agent-x64dbg/src/main/py/src/ghidraxdbg/commands.py:107

        self.code = code

    def __str__(self) -> str:
        return repr(self.code)


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

    def require_no_client(self) -> None:
        if self.client != None:
            raise RuntimeError("Already connected")

    def reset_client(self) -> None:

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Ensure 'ghidra trace start' completes successfully before issuing register commands.
  2. Verify start_trace executed the register_mapper assignment line without error.
  3. Manually set STATE.trace.extra.register_mapper = arch.compute_register_mapper(language) if needed.

Example fix

# before: register op before trace start
rm = STATE.trace.extra.require_rm()  # register_mapper is None

# after: start trace first
start_trace(compute_name())
rm = STATE.trace.extra.require_rm()
Defensive patterns

Strategy: validation

Validate before calling

extra = STATE.trace.extra if STATE.trace else None
if extra is None or extra.register_mapper is None:
    raise RuntimeError("Register mapper not initialized; run 'ghidra trace start' first")

Type guard

def has_register_mapper(extra: 'Extra') -> bool:
    return extra is not None and extra.register_mapper is not None

Try / catch

try:
    rm = STATE.trace.extra.require_rm()
except RuntimeError:
    start_trace(compute_name())
    rm = STATE.trace.extra.require_rm()

Prevention

When it happens

Trigger: A trace method calls STATE.trace.extra.require_rm() (directly or via a register read/write operation) before start_trace has set register_mapper.

Common situations: Register read/write commands issued before 'ghidra trace start'. start_trace failed before setting the register mapper. The language detected by compute_ghidra_lcsp did not have a registered mapper and compute_register_mapper was bypassed.

Related errors


AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14). Data as JSON: /api/errors/2c3da48a0da22f21. Report an issue: GitHub.