<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
Wed Sep 1 14:04:15 PDT 2010


Got it working.  Using GetClass and toString helped me see that I was
passing the wrong kind of object as a parameter across the JNI
boundary.  -Pete

Pete Brunet wrote:
> p.s. I tried the various JNI -XX switches listed here, at least the ones
> that made sense to try in my situation:
> http://www.md.pp.ru/~eu/jdk6options.html
>
> Pete Brunet wrote:
>   
>> 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