NationalSecurityAgency/ghidra · error · IOException

Open failed: {}

Error message

Open failed: {}

What it means

In getImmutableObject, after content-type validation passes, opening the DB (buffer file, DBHandle, DBTrace construction) can throw unexpected Throwables — schema errors, missing managers, deserialization faults, version-incompatible structures. These are caught, logged, and rethrown as a single IOException("Open failed: <msg>", t) preserving the cause.

Source

Thrown at Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTraceContentHandler.java:87

		try {
			bf = dbItem.open(version, minChangeVersion);
			dbh = new DBHandle(bf);
			OpenMode openMode = OpenMode.IMMUTABLE;
			trace = new DBTrace(dbh, openMode, monitor, consumer);
			getTraceChangeSet(trace, bf);
			success = true;
			return trace;
		}
		catch (VersionException | IOException | CancelledException e) {
			throw e;
		}
		catch (Throwable t) {
			Msg.error(this, "GetImmutableObject failed", t);
			String msg = t.getMessage();
			if (msg == null) {
				msg = t.toString();
			}
			throw new IOException("Open failed: " + msg, t);
		}
		finally {
			if (!success) {
				if (trace != null) {
					trace.release(consumer);
				}
				if (dbh != null) {
					dbh.close();
				}
				if (bf != null) {
					bf.dispose();
				}
			}
		}
	}

	@Override
	public DBTrace getReadOnlyObject(FolderItem item, int version, boolean okToUpgrade,

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Inspect getCause() of the IOException to find the real failure (often VersionException-like or a deserialization error).
  2. If the cause indicates a version/schema mismatch, upgrade Ghidra or re-export the trace from its source on the current build.
  3. If corruption, restore from version control / re-record the trace.
  4. Check the log line 'GetImmutableObject failed' for the stack trace.

Example fix

// before
try {
    DBTrace t = handler.getImmutableObject(item, consumer, ver, minVer, monitor);
} catch (IOException e) {
    throw new RuntimeException("cannot open", e);
}

// after: surface the root cause
try {
    DBTrace t = handler.getImmutableObject(item, consumer, ver, minVer, monitor);
} catch (IOException e) {
    Throwable root = e.getCause() != null ? e.getCause() : e;
    throw new IOException("Open failed for trace; root cause: " + root, e);
}
Defensive patterns

Strategy: try-catch

Validate before calling

// Pre-check: confirm the file exists, is a trace, and warn on version metadata if available.
if (!DBTraceContentHandler.TRACE_CONTENT_TYPE.equals(item.getContentType())) {
    throw new IOException("not a trace: " + item.getContentType());
}

Try / catch

try {
    return handler.getImmutableObject(item, consumer, ver, minVer, monitor);
} catch (IOException e) {
    Throwable cause = e.getCause();
    if (cause instanceof VersionException ve) {
        // prompt upgrade / open on compatible build
    } else {
        // corruption or schema fault: restore from backup
        Msg.error(this, "Trace open failed", cause == null ? e : cause);
    }
    throw e;
}

Prevention

When it happens

Trigger: Any non-IOException/VersionException/CancelledException Throwable during immutable open: a corrupt buffer file, an unrecognized stored schema, an NPE in a trace manager initializer, or an incompatible Ghidra version reading a newer trace DB.

Common situations: Opening a trace created by a newer/older Ghidra build whose DB schema differs. Truncated or corrupted .gbr/.gbt buffer files. A refactor that changed DBTrace storage layout without a version bump. Missing/changed dependent DB schema.

Related errors


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