NationalSecurityAgency/ghidra · error · IllegalArgumentException
Register {} is not in language {}
Error message
Register {} is not in language {} What it means
Thrown by FlatDebuggerAPI.readRegister(platform, register) when the supplied Register object does not belong to the platform's language. It checks that the language's register of the same name equals the supplied register.
Source
Thrown at Ghidra/Debug/Debugger-api/src/main/java/ghidra/debug/flatapi/FlatDebuggerAPI.java:1108
default List<RegisterValue> readRegistersNamed(Collection<String> names) {
return readRegisters(validateRegisterNames(requireCurrentTrace().getBaseLanguage(), names));
}
/**
* Read a register from the current context, refreshing from the target if needed
*
* @param platform the platform whose language defines the register
* @param register the register
* @return the value, or null on error
*/
default RegisterValue readRegister(TracePlatform platform, Register register) {
DebuggerCoordinates current = getCurrentDebuggerCoordinates();
if (platform.getTrace() != current.getTrace()) {
throw new IllegalArgumentException("Given platform is not from the current trace");
}
Language language = platform.getLanguage();
if (!register.equals(language.getRegister(register.getName()))) {
throw new IllegalArgumentException(
"Register " + register + " is not in language " + language);
}
return readRegister(platform, requireThread(current.getThread()), current.getFrame(),
current.getSnap(), register);
}
/**
* Read a register from the current context, refreshing from the target if needed
*
* @param register the register
* @return the value, or null on error
*/
default RegisterValue readRegister(Register register) {
return readRegister(requireCurrentPlatform(), register);
}
/**
* Read a register from the current context, refreshing from the target if neededView on GitHub (pinned to d5f144c24d)
Solutions
- Obtain the register from platform.getLanguage().getRegister(name) immediately before the call.
- Assert the register's language matches the platform's language.
- Re-resolve the register object whenever the platform changes.
Example fix
// before
Register reg = oldLang.getRegister("RAX");
readRegister(platform, reg); // throws if platform.lang != oldLang
// after
Register reg = platform.getLanguage().getRegister("RAX");
readRegister(platform, reg); Defensive patterns
Strategy: validation
Validate before calling
Register resolved = platform.getLanguage().getRegister(register.getName());
if (!register.equals(resolved)) {
throw new IllegalStateException(
"Register not in platform language");
} Type guard
static boolean registerInLanguage(TracePlatform platform,
Register register) {
return register.equals(
platform.getLanguage().getRegister(register.getName()));
} Try / catch
try {
RegisterValue v = readRegister(platform, reg);
} catch (IllegalArgumentException e) {
if (e.getMessage().startsWith("Register ")) {
reg = platform.getLanguage().getRegister(reg.getName());
} else throw e;
} Prevention
- Resolve Register objects from the platform's own language at call time.
- Re-resolve registers whenever the platform/language changes.
When it happens
Trigger: Calling readRegister(platform, register) where register was obtained from a different language than platform.getLanguage().
Common situations: Register obtained from an old platform's language and reused after a platform/language change; mixing registers across architectures; register from a different compiler/sleigh language variant.
Related errors
- One or more invalid register names: {}
- Invalid register name: {}
- Given platform is not from the current trace
- There is no platform
- Emulation requires a Sleigh language
AI-assisted analysis of NationalSecurityAgency/ghidra@d5f144c24d (2026-08-14).
Data as JSON: /api/errors/57798d6d61df55ac.
Report an issue: GitHub.