NationalSecurityAgency/ghidra · critical · IOException

Platform table is corrupt. Missing language ${langKey}

Error message

Platform table is corrupt. Missing language ${langKey}

What it means

During fresh() load of a stored guest-platform row, the manager resolves the language by its stored key. If getLanguageByKey(langKey) returns null and langKey != -1 (the -1 sentinel marks the host), it throws IOException("Platform table is corrupt. Missing language"). The processor language referenced by this guest platform is not registered with the language provider, so the row cannot be rehydrated.

Source

Thrown at Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/guest/DBTraceGuestPlatform.java:188

	}

	void set(CompilerSpec compilerSpec) {
		this.languageEntry = manager.getOrCreateLanguage(compilerSpec.getLanguage());
		this.langKey = (int) (languageEntry == null ? -1 : languageEntry.getKey());
		this.cSpecID = compilerSpec.getCompilerSpecID();
		update(LANGKEY_COLUMN, CSPECID_COLUMN);
		this.compilerSpec = compilerSpec;
	}

	@Override
	protected void fresh(boolean created) throws IOException {
		super.fresh(created);
		if (created) {
			return;
		}
		this.languageEntry = manager.getLanguageByKey(langKey);
		if (languageEntry == null && langKey != -1) {
			throw new IOException("Platform table is corrupt. Missing language " + langKey);
		}
		compilerSpec = getLanguage().getCompilerSpecByID(cSpecID);
		if (compilerSpec == null) {
			throw new IOException(
				"Platform table is corrupt. Invalid compiler spec " + compilerSpec);
		}
	}

	protected void loadDataTypeManager(OpenMode openMode, TaskMonitor monitor)
			throws CancelledException, VersionException, IOException {
		this.dataTypeManager = new DBTraceDataTypeManager(manager.dbh, openMode, manager.lock,
			monitor, manager.trace, this);
	}

	@Override
	public Trace getTrace() {
		return manager.trace;
	}

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Install/register the missing processor language module.
  2. Re-open the trace on the original Ghidra + processor configuration that created it.
  3. If unrecoverable, treat the trace as corrupt and rebuild the guest platform.
Defensive patterns

Strategy: try-catch

Validate before calling

// preflight: ensure the language is registered before opening
if (languageService.getLanguage(new LanguageID(langId)) == null) {
    // install/locate the processor language first
}

Try / catch

try { trace.open(...); }
catch (IOException e) {
    if (e.getMessage().contains("Missing language")) { /* require language module */ }
    else throw e;
}

Prevention

When it happens

Trigger: Opening a trace whose guest platform was built on a processor language that is no longer installed/registered; corrupt or hand-edited DB with an orphaned langKey.

Common situations: Sharing traces across installs with different processor modules; uninstalling/moving a processor language pack after a trace was saved; version drift in language definitions.

Related errors


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