JetBrains/intellij-community · warning · EvaluateException
Inconsistent debug information
Error message
Inconsistent debug information
What it means
NodeDescriptorImpl.updateRepresentationNoNotify catches InconsistentDebugInfoException from calcRepresentation (the code that computes the display label of a variables-tree node) and rethrows it as an EvaluateException with this message. InconsistentDebugInfoException is raised by the JDI layer when the target VM's reported type/field/method information contradicts itself — usually because loaded classes were redefined (hot-swap) while the debugger held cached mirrors.
Source
Thrown at java/debugger/impl/src/com/intellij/debugger/ui/impl/watch/NodeDescriptorImpl.java:70
if (myUserData == null) {
myUserData = new HashMap<>();
}
myUserData.put(key, value);
}
public void updateRepresentation(EvaluationContextImpl context, DescriptorLabelListener labelListener) {
updateRepresentationNoNotify(context, labelListener);
labelListener.labelChanged();
}
public void updateRepresentationNoNotify(EvaluationContextImpl context, DescriptorLabelListener labelListener) {
try {
try {
myEvaluateException = null;
myLabel = calcRepresentation(context, labelListener);
}
catch (InconsistentDebugInfoException e) {
throw new EvaluateException(JavaDebuggerBundle.message("error.inconsistent.debug.info"));
}
catch (InvalidStackFrameException e) {
throw new EvaluateException(JavaDebuggerBundle.message("error.invalid.stackframe"));
}
catch (ObjectCollectedException e) {
throw EvaluateExceptionUtil.OBJECT_WAS_COLLECTED;
}
catch (VMDisconnectedException e) {
throw e;
}
catch (RuntimeException e) {
if (e.getCause() instanceof InterruptedException) {
throw e;
}
if (context != null && context.getVirtualMachineProxy().canBeModified()) { // do not care in read only vms
LOG.debug(e);
}
else {View on GitHub (pinned to be881553f2)
Solutions
- Restart the debug session (stop and re-run) so the debugger rebuilds its mirrors against the current VM state
- Avoid partial HotSwap of structural changes (added/removed fields/methods are not hot-swappable) — rebuild and restart instead
- Check for duplicate classes on the classpath (module output vs jar) and remove the stale copy
- If it persists, invalidate caches (File | Invalidate Caches) and rebuild the project
Defensive patterns
Strategy: retry
Try / catch
try {
descriptor.updateRepresentationNoNotify(context, listener);
} catch (EvaluateException e) {
// debug info is inconsistent after class redefinition: refresh the session once
refreshVariablesViewAndRetryOnce(descriptor);
} Prevention
- Do not hot-swap structural changes (fields/methods); rebuild and restart the session
- Keep a single copy of each class on the classpath to avoid mixed debug info
- Restart the debug session after larger code changes instead of stacking HotSwaps
When it happens
Trigger: Expanding or refreshing the debugger Variables/Watch view after classes were redefined in the running VM (HotSwap), when two class loaders load different versions of the same class, or when struts of debug info differ between the IDE's cached ReferenceType and the live VM state.
Common situations: Iterative development with 'Reload Changed Classes' / build-while-debugging; remote debugging a server that hot-redeploys; multi-module projects where the same class exists on both the module output and a dependency jar.
Related errors
- Internal exception - invalid stackframe
- Interface method invocation is not supported in JVM {}. Use
- Cannot construct wrapper object for value of type {}: Unable
- Cannot convert to primitive value of type
- Unable to set value
AI-assisted analysis of JetBrains/intellij-community@be881553f2 (2026-08-14).
Data as JSON: /api/errors/275f59a0346e2bd5.
Report an issue: GitHub.