<AWT Dev> Need a hint on how to debug a VM assertion failure caused by my awt code

Pete Brunet peter.brunet at oracle.com
Mon Aug 30 13:26:55 PDT 2010


I'm looking for guidance in how to debug the following jvm assert
failure.  I've tried both -Xcheck:jni and -verbose:jni but neither of
those added any information at the point of failure.  Thanks, Pete

#  Internal Error
(c:\OpenJDK-b96m\jdk7\hotspot\src\share\vm\interpreter\linkResolver.cpp:71),
pid=5216, tid=7228
#  assert(resolved_method->signature() == selected_method->signature())
failed: signatures must correspond

The stack looks like this:

V  [jvm.dll+0x3a8894]
V  [jvm.dll+0x128195]
V  [jvm.dll+0x29b5fd]
V  [jvm.dll+0x29e42e]
V  [jvm.dll+0x29f795]
V  [jvm.dll+0x29f8f8]
V  [jvm.dll+0x1a2e50]
j 
java.awt.Component$1.getAccessibleContext(Ljava/awt/Component;)Ljavax/accessibility/AccessibleContext;+16
v  ~StubRoutines::call_stub
...

The calling code in awt_Component.cpp looks like this:

In AwtComponent::InitIDs:

    jclass awtAccessorCls = env->FindClass("sun/awt/AWTAccessor");
    jclass componentAccessorCls =
env->FindClass("sun/awt/AWTAccessor$ComponentAccessor");
    DASSERT(awtAccessorCls);
    DASSERT(componentAccessorCls);
    ...
    AwtComponent::getComponentAccessorMID =
        env->GetStaticMethodID(awtAccessorCls, "getComponentAccessor",
"()Lsun/awt/AWTAccessor$ComponentAccessor;");
    AwtComponent::getAccessibleContextMID =
        env->GetMethodID(componentAccessorCls, "getAccessibleContext",
"(Ljava/awt/Component;)Ljavax/accessibility/AccessibleContext;");
    DASSERT(AwtComponnet::getComponentAccessorMID);
    DASSERT(AwtComponent::getAccessibleContextMID);
    ...

jobject AwtComponent::GetAccessibleContext(HWND hwnd) {
    JNIEnv *env = (JNIEnv *)JNU_GetEnv(jvm, JNI_VERSION_1_2);
    jclass awtAccessorCls = env->FindClass("sun/awt/AWTAccessor");
    jobject ca = env->CallStaticObjectMethod(awtAccessorCls,
AwtComponent::getComponentAccessorMID);
    DASSERT(!safe_ExceptionOccurred(env));
    AwtComponent* c = GetComponentImpl(hwnd);
    jobject self = c->GetPeer(env);  // self is the java side of the
peer code, i.e. the Component
    jobject ac = env->CallObjectMethod(ca,
AwtComponent::getAccessibleContextMID, self);
    ...

The called method, getAccessibleContext, in java.awt.Component looks
like this:

    static {
      AWTAccessor.setComponentAccessor(new AWTAccessor.ComponentAccessor() {
          ...
          public AccessibleContext getAccessibleContext(Component comp) {
              return comp.accessibleContext;
          }
      });
    }

Thanks, Pete



More information about the awt-dev mailing list