NationalSecurityAgency/ghidra · error · RuntimeError

Not connected

Error message

Not connected

What it means

Raised as RuntimeError by State.require_client() when STATE.client is None — i.e. no connection to Ghidra's trace RMI bridge exists yet. Any trace command that needs the socket must connect first via ghidra_trace_connect()/ghidra_trace_listen().

Source

Thrown at Ghidra/Debug/Debugger-agent-drgn/src/main/py/src/ghidradrgn/commands.py:105

    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:
        self.client: Optional[Client] = None
        self.reset_trace()

    def require_trace(self) -> Trace[Extra]:
        if self.trace is None:
            raise RuntimeError("No trace active")
        return self.trace

    def require_no_trace(self) -> None:
        if self.trace != None:
            raise RuntimeError("Trace already started")

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Call ghidra_trace_connect('host:port') (or ghidra_trace_listen) and confirm the 'Connected ...' message before trace commands.
  2. Guard: if STATE.client is None: report 'connect first'.
  3. If a prior connect raised, inspect the port/host and retry connect before continuing.

Example fix

// before
STATE.require_client().create_trace(...)  # RuntimeError: Not connected
// after
if STATE.client is None:
    ghidra_trace_connect(address)
STATE.require_client().create_trace(...)
Defensive patterns

Strategy: validation

Validate before calling

if STATE.client is None:
    raise RuntimeError('call ghidra_trace_connect/listen first')
client = STATE.require_client()

Type guard

def is_connected() -> bool:
    return getattr(STATE, 'client', None) is not None

Try / catch

try:
    client = STATE.require_client()
except RuntimeError as e:
    if 'Not connected' in str(e):
        ghidra_trace_connect(address); client = STATE.require_client()
    else:
        raise

Prevention

When it happens

Trigger: Calling ghidra_trace_start(), start_trace(), or any client-dependent command before ghidra_trace_connect()/ghidra_trace_listen() succeeded; after ghidra_trace_disconnect() reset the client.

Common situations: Running trace commands in the wrong order; connect() failed silently (port closed) leaving client None; reconnecting after a disconnect without a fresh connect.

Related errors


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