NationalSecurityAgency/ghidra · error · RuntimeException

The parameter ' ' of method ' ' refers to a non-existent…

Error message

The parameter '%s' of method '%s' refers to a non-existent schema '%s'

What it means

Thrown by TraceRmiTarget.typeMatches when a RemoteParameter's declared schema type name is not present in the SchemaContext of the root schema. The method specification (from the trace's object schema) references a schema name that the loaded schema definitions do not define, so type matching for that method cannot proceed.

Solutions

  1. Inspect the error's schema name and verify it is declared in the loaded schema definitions; correct the spelling in the method spec or schema file.
  2. Ensure all required schema definition files/packages for the target are installed and loaded.
  3. Regenerate the method/schema spec against the schema set currently deployed in Ghidra.
Defensive patterns

Strategy: validation

Validate before calling

SchemaContext ctx = rootSchema.getContext();
if (ctx.getSchemaOrNull(param.type()) == null) {
    throw new IllegalStateException("unknown schema: " + param.type());
}

Type guard

boolean schemaExists(TraceObjectSchema root, SchemaName name) {
    return root.getContext().getSchemaOrNull(name) != null;
}

Prevention

When it happens

Trigger: A schema manifest references a type that was never declared, was misspelled, or belongs to a schema version newer than the loaded definitions; an extension method spec names a schema that the current Ghidra build does not ship.

Common situations: Custom schema files with a typo'd schema name; method spec generated against a newer schema set; missing schema definition file; partial/corrupt schema package.

Related errors


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

Appendix: source

Thrown at Ghidra/Debug/Debugger-rmi-trace/src/main/java/ghidra/app/plugin/core/debug/service/tracermi/TraceRmiTarget.java:610

					.findFirst()
					.orElse(null);
		}
	}

	record MatchedMethod(RemoteMethod method, Map<String, RemoteParameter> params, int score)
			implements Comparable<MatchedMethod> {
		@Override
		public int compareTo(MatchedMethod that) {
			return Integer.compare(this.score, that.score);
		}
	}

	protected static boolean typeMatches(RemoteMethod method, RemoteParameter param,
			TraceObjectSchema rootSchema, KeyPath path, Class<?> type) {
		SchemaContext ctx = rootSchema.getContext();
		TraceObjectSchema sch = ctx.getSchemaOrNull(param.type());
		if (sch == null) {
			throw new RuntimeException(
				"The parameter '%s' of method '%s' refers to a non-existent schema '%s'"
						.formatted(param.name(), method.name(), param.type()));
		}
		if (type == TraceObject.class) {
			// The method cannot impose any further restriction. It must accept any object.
			return sch == PrimitiveTraceObjectSchema.OBJECT;
		}
		else if (TraceObjectInterface.class.isAssignableFrom(type)) {
			if (path == null) {
				return sch.getInterfaces().contains(type);
			}
			KeyPath found =
				rootSchema.searchForSuitable(type.asSubclass(TraceObjectInterface.class), path);
			if (found == null) {
				return false;
			}
			return sch == rootSchema.getSuccessorSchema(path);
		}

View on GitHub (pinned to d5f144c24d)