NationalSecurityAgency/ghidra · error · RuntimeError
Already connected
Error message
Already connected
What it means
Raised as RuntimeError by State.require_no_client() when STATE.client is already set. Commands that establish a connection (ghidra_trace_connect/listen) refuse to run twice to avoid leaking sockets; you must disconnect first.
Source
Thrown at Ghidra/Debug/Debugger-agent-drgn/src/main/py/src/ghidradrgn/commands.py:110
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")
def reset_trace(self) -> None:
self.trace: Optional[Trace[Extra]] = None
util.set_convenience_variable('_ghidra_tracing', "false")
self.reset_tx()View on GitHub (pinned to d5f144c24d)
Solutions
- Call ghidra_trace_disconnect() before re-connecting.
- Guard: if STATE.client is not None: disconnect first.
- In startup scripts, make connect idempotent by checking require_no_client only when client is None.
Example fix
// before
ghidra_trace_connect(address) # RuntimeError: Already connected
// after
if STATE.client is not None:
ghidra_trace_disconnect()
ghidra_trace_connect(address) Defensive patterns
Strategy: validation
Validate before calling
if STATE.client is not None:
raise RuntimeError('already connected; call ghidra_trace_disconnect first')
# or just disconnect:
if STATE.client is not None:
ghidra_trace_disconnect() Type guard
def is_disconnected() -> bool:
return getattr(STATE, 'client', None) is None Try / catch
try:
ghidra_trace_connect(address)
except RuntimeError as e:
if 'Already connected' in str(e):
ghidra_trace_disconnect(); ghidra_trace_connect(address)
else:
raise Prevention
- Call ghidra_trace_disconnect() before re-connecting.
- Make connect scripts idempotent: disconnect-if-connected, then connect.
- Avoid running connect twice from nested scripts.
When it happens
Trigger: Calling ghidra_trace_connect() or ghidra_trace_listen() while a previous connection is still active.
Common situations: Re-running a connect script without an intervening ghidra_trace_disconnect(); a connect that partially succeeded and left client set.
Related errors
AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14).
Data as JSON: /api/errors/8f33d34b7ba89b04.
Report an issue: GitHub.