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);
}
@OverrideView on GitHub (pinned to d5f144c24d)
Solutions
- Use getEquate(name) first and update its value instead of creating.
- Catch DuplicateNameException and fall back to the existing equate.
- 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
- Check getByName before create for idempotent scripts.
- Namespace equate names per importer.
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.