{"record":{"id":"a700da21389db343","repo":"NationalSecurityAgency/ghidra","slug":"addressspace-is-not-in-this-trace-language","errorCode":null,"errorMessage":"AddressSpace '{}' is not in this trace (language={})","messagePattern":"AddressSpace '(.+?)' is not in this trace \\(language=(.+?)\\)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTrace.java","lineNumber":261,"sourceCode":"\n\t@Internal\n\tpublic void assertValidAddress(Address pc) {\n\t\tif (pc == null) {\n\t\t\treturn;\n\t\t}\n\t\tassertValidSpace(pc.getAddressSpace());\n\t}\n\n\t@Internal\n\tpublic void assertValidSpace(AddressSpace as) {\n\t\tif (as == AddressSpace.OTHER_SPACE) {\n\t\t\treturn;\n\t\t}\n\t\tif (as == Address.NO_ADDRESS.getAddressSpace()) {\n\t\t\treturn;\n\t\t}\n\t\tif (baseAddressFactory.getAddressSpace(as.getSpaceID()) != as) {\n\t\t\tthrow new IllegalArgumentException(\"AddressSpace '\" + as +\n\t\t\t\t\"' is not in this trace (language=\" + getBaseLanguage() + \")\");\n\t\t}\n\t}\n\n\t@Override\n\tpublic DBTraceChangeSet getChangeSet() {\n\t\treturn traceChangeSet;\n\t}\n\n\t// Internal\n\tpublic DBCachedObjectStoreFactory getStoreFactory() {\n\t\treturn storeFactory;\n\t}\n\n\t@Override\n\tpublic String getDescription() {\n\t\treturn \"Trace\";\n\t}","sourceCodeStart":243,"sourceCodeEnd":279,"githubUrl":"https://github.com/NationalSecurityAgency/ghidra/blob/d5f144c24d6bc53c9cbf4448c6d11143e7696206/Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/DBTrace.java#L243-L279","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Translate addresses through the platform's address mapping (platform.mapGuestToHost / trace's address factory) before asserting.","Ensure the Program/trace that produced the address uses the same base language as the trace.","For guest addresses, map to host first; for OTHER_SPACE/NO_ADDRESS the guard already passes."],"exampleFix":"// before: guest address asserted directly\ntrace.assertValidAddress(guestPc);\n\n// after: map guest -> host (trace space) first\nAddress hostPc = platform.mapGuestToHost(guestPc);\ntrace.assertValidAddress(hostPc);","handlingStrategy":"validation","validationCode":"AddressSpace as = pc.getAddressSpace();\nif (as != AddressSpace.OTHER_SPACE && as != Address.NO_ADDRESS.getAddressSpace()\n        && trace.getAddressFactory().getAddressSpace(as.getSpaceID()) != as) {\n    throw new IllegalStateException(\"AddressSpace not in this trace: \" + as);\n}","typeGuard":"static boolean spaceBelongsToTrace(Trace trace, AddressSpace as) {\n    if (as == AddressSpace.OTHER_SPACE) return true;\n    if (as == Address.NO_ADDRESS.getAddressSpace()) return true;\n    return trace.getAddressFactory().getAddressSpace(as.getSpaceID()) == as;\n}","tryCatchPattern":"try {\n    trace.assertValidSpace(as);\n} catch (IllegalArgumentException e) {\n    if (e.getMessage().contains(\"not in this trace\")) {\n        // re-derive address from this trace's address factory / map guest->host\n    } else throw e;\n}","preventionTips":["Always derive addresses from the trace's own address factory or map guest addresses to host first.","Do not mix addresses across traces or between a Program and a Trace of different languages.","When recording, set PC from values decoded with the same base language as the trace."],"tags":["address-space","trace","language-mismatch","validation"],"backgroundTag":null,"analyzedSha":"d5f144c24d6bc53c9cbf4448c6d11143e7696206","analyzedAt":"2026-08-14T01:00:57.564Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}