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 needed

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Obtain the register from platform.getLanguage().getRegister(name) immediately before the call.
  2. Assert the register's language matches the platform's language.
  3. 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

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


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