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

  1. Restart the debug session (stop and re-run) so the debugger rebuilds its mirrors against the current VM state
  2. Avoid partial HotSwap of structural changes (added/removed fields/methods are not hot-swappable) — rebuild and restart instead
  3. Check for duplicate classes on the classpath (module output vs jar) and remove the stale copy
  4. 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

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


AI-assisted analysis of JetBrains/intellij-community@be881553f2 (2026-08-14). Data as JSON: /api/errors/275f59a0346e2bd5. Report an issue: GitHub.