NationalSecurityAgency/ghidra · error · IllegalArgumentException

AddressSpace '{}' is not in this trace (language={})

Error message

AddressSpace '{}' is not in this trace (language={})

What it means

DBTrace.assertValidSpace verifies an AddressSpace actually belongs to the trace's own address factory (built from its base language/compiler spec). It allows OTHER_SPACE and NO_ADDRESS as universal escapes. Any other space whose SpaceID is not registered (i.e. produced by a different language's address factory) is rejected, because addresses from a foreign language cannot be interpreted in this trace.

Source

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

	@Internal
	public void assertValidAddress(Address pc) {
		if (pc == null) {
			return;
		}
		assertValidSpace(pc.getAddressSpace());
	}

	@Internal
	public void assertValidSpace(AddressSpace as) {
		if (as == AddressSpace.OTHER_SPACE) {
			return;
		}
		if (as == Address.NO_ADDRESS.getAddressSpace()) {
			return;
		}
		if (baseAddressFactory.getAddressSpace(as.getSpaceID()) != as) {
			throw new IllegalArgumentException("AddressSpace '" + as +
				"' is not in this trace (language=" + getBaseLanguage() + ")");
		}
	}

	@Override
	public DBTraceChangeSet getChangeSet() {
		return traceChangeSet;
	}

	// Internal
	public DBCachedObjectStoreFactory getStoreFactory() {
		return storeFactory;
	}

	@Override
	public String getDescription() {
		return "Trace";
	}

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Translate addresses through the platform's address mapping (platform.mapGuestToHost / trace's address factory) before asserting.
  2. Ensure the Program/trace that produced the address uses the same base language as the trace.
  3. For guest addresses, map to host first; for OTHER_SPACE/NO_ADDRESS the guard already passes.

Example fix

// before: guest address asserted directly
trace.assertValidAddress(guestPc);

// after: map guest -> host (trace space) first
Address hostPc = platform.mapGuestToHost(guestPc);
trace.assertValidAddress(hostPc);
Defensive patterns

Strategy: validation

Validate before calling

AddressSpace as = pc.getAddressSpace();
if (as != AddressSpace.OTHER_SPACE && as != Address.NO_ADDRESS.getAddressSpace()
        && trace.getAddressFactory().getAddressSpace(as.getSpaceID()) != as) {
    throw new IllegalStateException("AddressSpace not in this trace: " + as);
}

Type guard

static boolean spaceBelongsToTrace(Trace trace, AddressSpace as) {
    if (as == AddressSpace.OTHER_SPACE) return true;
    if (as == Address.NO_ADDRESS.getAddressSpace()) return true;
    return trace.getAddressFactory().getAddressSpace(as.getSpaceID()) == as;
}

Try / catch

try {
    trace.assertValidSpace(as);
} catch (IllegalArgumentException e) {
    if (e.getMessage().contains("not in this trace")) {
        // re-derive address from this trace's address factory / map guest->host
    } else throw e;
}

Prevention

When it happens

Trigger: Calling assertValidAddress(pc) or assertValidSpace(as) with an address whose AddressSpace comes from a different language's AddressFactory than the trace's base language (mismatched architecture). Passing a guest-platform address directly into host assertions.

Common situations: Recording a trace under one language but computing PC/addresses from a Program loaded with another (e.g. version-mismatched) language. Mixing addresses across traces. Thread/PC set from an external source with a stale language reference.

Related errors


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