NationalSecurityAgency/ghidra · warning · DuplicateNameException

Equate already exists: {}

Error message

Equate already exists: {}

What it means

Thrown as DuplicateNameException by DBTraceEquateManager.create when an equate with the given name already exists in equatesByName. Equate names must be unique per trace. Note the name is also validated by TraceEquateManager.validateName before the duplicate check, so an invalid name throws earlier.

Source

Thrown at Ghidra/Debug/Framework-TraceModeling/src/main/java/ghidra/trace/database/symbol/DBTraceEquateManager.java:124

	@Override
	protected DBTraceEquateSpace createSpace(AddressSpace space, DBTraceSpaceEntry ent)
			throws VersionException, IOException {
		return new DBTraceEquateSpace(this, dbh, space, ent);
	}

	@Override
	public DBTraceEquateSpace getForSpace(AddressSpace space, boolean createIfAbsent) {
		return super.getForSpace(space, createIfAbsent);
	}

	@Override
	public DBTraceEquate create(String newName, long value)
			throws DuplicateNameException, IllegalArgumentException {
		TraceEquateManager.validateName(newName);
		try (LockHold hold = LockHold.lock(lock.writeLock())) {
			DBTraceEquate equate = equatesByName.getOne(newName);
			if (equate != null) {
				throw new DuplicateNameException("Equate already exists: " + newName);
			}
			equate = equateStore.create();
			equate.set(newName, value);
			return equate;
		}
	}

	@Override
	public Collection<? extends DBTraceEquate> getAll() {
		return equateView;
	}

	@Override
	public DBTraceEquate getByName(String equateName) {
		return equatesByName.getOne(equateName);
	}

	@Override

View on GitHub (pinned to d5f144c24d)

Solutions

  1. Use getEquate(name) first and update its value instead of creating.
  2. Catch DuplicateNameException and fall back to the existing equate.
  3. Namespace equate names per importer to avoid collisions.

Example fix

// before
DBTraceEquate eq = mgr.create("FOO", 1);
// after
DBTraceEquate eq = mgr.getByName("FOO");
if (eq == null) eq = mgr.create("FOO", 1);
else eq.setValue(1);
Defensive patterns

Strategy: try-catch

Validate before calling

DBTraceEquate existing = mgr.getByName(name);
if (existing != null) { existing.setValue(value); return existing; }
return mgr.create(name, value);

Try / catch

try { return mgr.create(name, value); }
catch (DuplicateNameException e) { return mgr.getByName(name); }

Prevention

When it happens

Trigger: Two calls to create("FOO", value) on the same trace; re-running an import that registers equates; an equate name colliding with a pre-existing one loaded from the trace.

Common situations: Idempotent scripts that do not check existence; concurrent equate creation from multiple plugins; replayed recordings.

Related errors


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