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
- Install/register the missing processor language module.
- Re-open the trace on the original Ghidra + processor configuration that created it.
- 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
- Bundle or document the required processor language module with shared traces.
- Pin the Ghidra/processor version used to create traces.
- Preflight language availability before attempting to open.
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
- Platform table is corrupt. Invalid compiler spec ${compilerS
- Table is corrupt. Got host platform in guest mapping.
- No variant codec with selector {}
- Id mismatch when inserting executable:
- No functions matching vectorid:
AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14).
Data as JSON: /api/errors/2f58470508f1b0be.
Report an issue: GitHub.