JDK-8278519 : serviceability/jvmti/FieldAccessWatch/FieldAccessWatch.java failed "assert(handle != __null) failed: JNI handle should not be null"
  • Type: Bug
  • Component: hotspot
  • Sub-Component: jvmti
  • Affected Version: 11,17,18
  • Priority: P4
  • Status: Resolved
  • Resolution: Fixed
  • OS: linux
  • CPU: x86_64
  • Submitted: 2021-12-09
  • Updated: 2022-05-23
  • Resolved: 2021-12-18
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 11 JDK 17 JDK 19
11.0.17-oracleFixed 17.0.4-oracleFixed 19 b03Fixed
Related Reports
Relates :  
Description
The following test failed in the JDK18 CI:

serviceability/jvmti/FieldAccessWatch/FieldAccessWatch.java

Here's a snippet from the log file:

"class: Ljava/util/ArrayList; method: grow(null)" modified field: "elementData", location: 56
"class: Ljava/util/ArrayList; method: add(TE;[Ljava/lang/Object;I)V" modified field: "size", location: 19
"class: Ljava/util/ArrayList; method: add(TE;)Z" accessed field: "modCount", location: 2
# To suppress the following error report, specify this argument
# after -XX: or in .hotspotrc:  SuppressErrorAt=/jniHandles.inline.hpp:92
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (/opt/mach5/mesos/work_dir/slaves/a2dc162d-743b-4800-9e92-31f85abb45b1-S136913/frameworks/1735e8a2-a1db-478c-8104-60c8b0af87dd-0196/executors/ec5dec9e-56d8-41a2-b66c-12296f16921f/runs/4d5bef26-6d20-44fa-bc83-40c1cc2f48ab/workspace/open/src/hotspot/share/runtime/jniHandles.inline.hpp:92), pid=30194, tid=30247
#  assert(handle != __null) failed: JNI handle should not be null
#
# JRE version: Java(TM) SE Runtime Environment (18.0+27) (fastdebug build 18-ea+27-1917)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (fastdebug 18-ea+27-1917, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)
# Problematic frame:
# V  [libjvm.so+0xa9f284]  JNIHandles::resolve_non_null(_jobject*)+0x1b4
#
# Core dump will be written. Default location: Core dumps may be processed with "/opt/core.sh %p" (or dumping to /opt/mach5/mesos/work_dir/slaves/a2dc162d-743b-4800-9e92-31f85abb45b1-S136877/frameworks/1735e8a2-a1db-478c-8104-60c8b0af87dd-0196/executors/12155c17-b10d-4669-97e9-e1c9792bd9c4/runs/aca0c8ff-5ac2-4816-9a9d-204618122fbf/testoutput/test-support/jtreg_open_test_hotspot_jtreg_hotspot_serviceability/scratch/3/core.30194)
#
# An error report file with more information is saved as:
# /opt/mach5/mesos/work_dir/slaves/a2dc162d-743b-4800-9e92-31f85abb45b1-S136877/frameworks/1735e8a2-a1db-478c-8104-60c8b0af87dd-0196/executors/12155c17-b10d-4669-97e9-e1c9792bd9c4/runs/aca0c8ff-5ac2-4816-9a9d-204618122fbf/testoutput/test-support/jtreg_open_test_hotspot_jtreg_hotspot_serviceability/scratch/3/hs_err_pid30194.log
#
# If you would like to submit a bug report, please visit:
#   https://bugreport.java.com/bugreport/crash.jsp
#
----------System.err:(0/0)----------
----------rerun:(37/7225)*----------


Here's the crashing thread's stack:

---------------  T H R E A D  ---------------

Current thread (0x00007f9b8435eca0):  JavaThread "UsageTracker" daemon [_thread_in_vm, id=30247, stack(0x00007f9b60592000,0x00007f9b60693000)]

Stack: [0x00007f9b60592000,0x00007f9b60693000],  sp=0x00007f9b6068fd80,  free space=1015k
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0xa9f284]  JNIHandles::resolve_non_null(_jobject*)+0x1b4
V  [libjvm.so+0x1027593]  jni_SetBooleanField+0xe3
C  [libFieldAccessWatch.so+0xb9b]  handleNotification+0x1bb
V  [libjvm.so+0x126a719]  JvmtiExport::post_field_access(JavaThread*, Method*, unsigned char*, Klass*, Handle, _jfieldID*)+0x2a9
V  [libjvm.so+0xef028e]  InterpreterRuntime::post_field_access(JavaThread*, oopDesc*, ConstantPoolCacheEntry*)+0x35e
j  java.util.ArrayList.add(Ljava/lang/Object;)Z+2 java.base@18-ea
j  com.sun.management.internal.PlatformMBeanProviderImpl.init()Ljava/util/List;+30 jdk.management@18-ea
j  com.sun.management.internal.PlatformMBeanProviderImpl.<init>()V+6 jdk.management@18-ea
j  java.lang.invoke.DirectMethodHandle$Holder.newInvokeSpecial(Ljava/lang/Object;)Ljava/lang/Object;+15 java.base@18-ea
j  java.lang.invoke.Invokers$Holder.invokeExact_MT(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+18 java.base@18-ea
j  jdk.internal.reflect.DirectConstructorHandleAccessor.invokeImpl([Ljava/lang/Object;)Ljava/lang/Object;+44 java.base@18-ea
j  jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance([Ljava/lang/Object;)Ljava/lang/Object;+68 java.base@18-ea
j  java.lang.reflect.Constructor.newInstanceWithCaller([Ljava/lang/Object;ZLjava/lang/Class;)Ljava/lang/Object;+41 java.base@18-ea
j  java.lang.reflect.Constructor.newInstance([Ljava/lang/Object;)Ljava/lang/Object;+30 java.base@18-ea
j  java.util.ServiceLoader$ProviderImpl.newInstance()Ljava/lang/Object;+19 java.base@18-ea
j  java.util.ServiceLoader$ProviderImpl.get()Ljava/lang/Object;+13 java.base@18-ea
j  java.util.ServiceLoader$3.next()Ljava/lang/Object;+58 java.base@18-ea
j  java.lang.management.ManagementFactory$PlatformMBeanFinder$1.run()Ljava/util/List;+27 java.management@18-ea
j  java.lang.management.ManagementFactory$PlatformMBeanFinder$1.run()Ljava/lang/Object;+1 java.management@18-ea
j  java.security.AccessController.executePrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;Ljava/lang/Class;)Ljava/lang/Object;+29 java.base@18-ea
j  java.security.AccessController.doPrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;+13 java.base@18-ea
j  java.security.AccessController.doPrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;[Ljava/security/Permission;)Ljava/lang/Object;+48 java.base@18-ea
j  java.lang.management.ManagementFactory$PlatformMBeanFinder.<clinit>()V+38 java.management@18-ea
v  ~StubRoutines::call_stub
V  [libjvm.so+0xf072e4]  JavaCalls::call_helper(JavaValue*, methodHandle const&, JavaCallArguments*, JavaThread*)+0x504
V  [libjvm.so+0xec6e65]  InstanceKlass::call_class_initializer(JavaThread*)+0x1e5
V  [libjvm.so+0xec9e64]  InstanceKlass::initialize_impl(JavaThread*)+0x6a4
V  [libjvm.so+0x131935f]  LinkResolver::resolve_static_call(CallInfo&, LinkInfo const&, bool, JavaThread*)+0xcf
V  [libjvm.so+0x131f6db]  LinkResolver::resolve_invoke(CallInfo&, Handle, constantPoolHandle const&, int, Bytecodes::Code, JavaThread*)+0x19b
V  [libjvm.so+0xef63f8]  InterpreterRuntime::resolve_invoke(JavaThread*, Bytecodes::Code)+0x248
V  [libjvm.so+0xef731d]  InterpreterRuntime::resolve_from_cache(JavaThread*, Bytecodes::Code)+0xbd
j  java.lang.management.ManagementFactory.getPlatformMXBean(Ljava/lang/Class;)Ljava/lang/management/PlatformManagedObject;+1 java.management@18-ea
j  java.lang.management.ManagementFactory.getRuntimeMXBean()Ljava/lang/management/RuntimeMXBean;+2 java.management@18-ea
j  java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(Ljava/lang/Object;)Ljava/lang/Object;+9 java.base@18-ea
j  java.lang.invoke.LambdaForm$MH+0x0000000801004400.invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+12 java.base@18-ea
j  java.lang.invoke.Invokers$Holder.invokeExact_MT(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+19 java.base@18-ea
j  jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+41 java.base@18-ea
j  jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+23 java.base@18-ea
j  java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+102 java.base@18-ea
j  sun.usagetracker.UsageTrackerClient$UsageTrackerRunnable$1.run()Ljava/util/List;+25 java.base@18-ea
j  sun.usagetracker.UsageTrackerClient$UsageTrackerRunnable$1.run()Ljava/lang/Object;+1 java.base@18-ea
j  java.security.AccessController.executePrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;Ljava/lang/Class;)Ljava/lang/Object;+29 java.base@18-ea
j  java.security.AccessController.doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;+5 java.base@18-ea
j  sun.usagetracker.UsageTrackerClient$UsageTrackerRunnable.getInputArguments()Ljava/util/List;+8 java.base@18-ea
j  sun.usagetracker.UsageTrackerClient$UsageTrackerRunnable.getRuntimeDetails()Ljava/lang/String;+173 java.base@18-ea
j  sun.usagetracker.UsageTrackerClient$UsageTrackerRunnable.buildMessage(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+121 java.base@18-ea
j  sun.usagetracker.UsageTrackerClient$UsageTrackerRunnable.run()V+52 java.base@18-ea
j  java.lang.Thread.run()V+11 java.base@18-ea
v  ~StubRoutines::call_stub
V  [libjvm.so+0xf072e4]  JavaCalls::call_helper(JavaValue*, methodHandle const&, JavaCallArguments*, JavaThread*)+0x504
V  [libjvm.so+0xf07b94]  JavaCalls::call_virtual(JavaValue*, Klass*, Symbol*, Symbol*, JavaCallArguments*, JavaThread*)+0x4b4
V  [libjvm.so+0xf07fe7]  JavaCalls::call_virtual(JavaValue*, Handle, Klass*, Symbol*, Symbol*, JavaThread*)+0x77
V  [libjvm.so+0x107c66b]  thread_entry(JavaThread*, JavaThread*)+0x12b
V  [libjvm.so+0x1921e8a]  JavaThread::thread_main_inner()+0x25a
V  [libjvm.so+0x192a250]  Thread::call_run()+0x100
V  [libjvm.so+0x160c464]  thread_native_entry(Thread*)+0x104

Java frames: (J=compiled Java code, j=interpreted, Vv=VM code)
j  java.util.ArrayList.add(Ljava/lang/Object;)Z+2 java.base@18-ea
j  com.sun.management.internal.PlatformMBeanProviderImpl.init()Ljava/util/List;+30 jdk.management@18-ea
j  com.sun.management.internal.PlatformMBeanProviderImpl.<init>()V+6 jdk.management@18-ea
j  java.lang.invoke.DirectMethodHandle$Holder.newInvokeSpecial(Ljava/lang/Object;)Ljava/lang/Object;+15 java.base@18-ea
j  java.lang.invoke.Invokers$Holder.invokeExact_MT(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+18 java.base@18-ea
j  jdk.internal.reflect.DirectConstructorHandleAccessor.invokeImpl([Ljava/lang/Object;)Ljava/lang/Object;+44 java.base@18-ea
j  jdk.internal.reflect.DirectConstructorHandleAccessor.newInstance([Ljava/lang/Object;)Ljava/lang/Object;+68 java.base@18-ea
j  java.lang.reflect.Constructor.newInstanceWithCaller([Ljava/lang/Object;ZLjava/lang/Class;)Ljava/lang/Object;+41 java.base@18-ea
j  java.lang.reflect.Constructor.newInstance([Ljava/lang/Object;)Ljava/lang/Object;+30 java.base@18-ea
j  java.util.ServiceLoader$ProviderImpl.newInstance()Ljava/lang/Object;+19 java.base@18-ea
j  java.util.ServiceLoader$ProviderImpl.get()Ljava/lang/Object;+13 java.base@18-ea
j  java.util.ServiceLoader$3.next()Ljava/lang/Object;+58 java.base@18-ea
j  java.lang.management.ManagementFactory$PlatformMBeanFinder$1.run()Ljava/util/List;+27 java.management@18-ea
j  java.lang.management.ManagementFactory$PlatformMBeanFinder$1.run()Ljava/lang/Object;+1 java.management@18-ea
j  java.security.AccessController.executePrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;Ljava/lang/Class;)Ljava/lang/Object;+29 java.base@18-ea
j  java.security.AccessController.doPrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;)Ljava/lang/Object;+13 java.base@18-ea
j  java.security.AccessController.doPrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;[Ljava/security/Permission;)Ljava/lang/Object;+48 java.base@18-ea
j  java.lang.management.ManagementFactory$PlatformMBeanFinder.<clinit>()V+38 java.management@18-ea
v  ~StubRoutines::call_stub
j  java.lang.management.ManagementFactory.getPlatformMXBean(Ljava/lang/Class;)Ljava/lang/management/PlatformManagedObject;+1 java.management@18-ea
j  java.lang.management.ManagementFactory.getRuntimeMXBean()Ljava/lang/management/RuntimeMXBean;+2 java.management@18-ea
j  java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(Ljava/lang/Object;)Ljava/lang/Object;+9 java.base@18-ea
j  java.lang.invoke.LambdaForm$MH+0x0000000801004400.invoke(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+12 java.base@18-ea
j  java.lang.invoke.Invokers$Holder.invokeExact_MT(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;+19 java.base@18-ea
j  jdk.internal.reflect.DirectMethodHandleAccessor.invokeImpl(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+41 java.base@18-ea
j  jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+23 java.base@18-ea
j  java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;+102 java.base@18-ea
j  sun.usagetracker.UsageTrackerClient$UsageTrackerRunnable$1.run()Ljava/util/List;+25 java.base@18-ea
j  sun.usagetracker.UsageTrackerClient$UsageTrackerRunnable$1.run()Ljava/lang/Object;+1 java.base@18-ea
j  java.security.AccessController.executePrivileged(Ljava/security/PrivilegedAction;Ljava/security/AccessControlContext;Ljava/lang/Class;)Ljava/lang/Object;+29 java.base@18-ea
j  java.security.AccessController.doPrivileged(Ljava/security/PrivilegedAction;)Ljava/lang/Object;+5 java.base@18-ea
j  sun.usagetracker.UsageTrackerClient$UsageTrackerRunnable.getInputArguments()Ljava/util/List;+8 java.base@18-ea
j  sun.usagetracker.UsageTrackerClient$UsageTrackerRunnable.getRuntimeDetails()Ljava/lang/String;+173 java.base@18-ea
j  sun.usagetracker.UsageTrackerClient$UsageTrackerRunnable.buildMessage(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;+121 java.base@18-ea
j  sun.usagetracker.UsageTrackerClient$UsageTrackerRunnable.run()V+52 java.base@18-ea
j  java.lang.Thread.run()V+11 java.base@18-ea
v  ~StubRoutines::call_stub

Comments
A pull request was submitted for review. URL: https://git.openjdk.java.net/jdk17u-dev/pull/362 Date: 2022-04-25 15:25:02 +0000
25-04-2022

Fix Request (17u): Should get backported for parity with 17.0.4-oracle. Applies cleanly. Test has passed.
25-04-2022

Changeset: 63e43030 Author: Alex Menkov <amenkov@openjdk.org> Date: 2021-12-18 08:08:47 +0000 URL: https://git.openjdk.java.net/jdk/commit/63e43030ed1260d14df950342c39a377231a3f40
18-12-2021

A pull request was submitted for review. URL: https://git.openjdk.java.net/jdk/pull/6874 Date: 2021-12-17 01:47:23 +0000
17-12-2021

Native part of the test sets testResultObject before each testcase and reset after it, and event handler checks if testResultObject is NULL and ignore the event if it is. But access to the testResultObject variable is not synchronized and we got a race here: - testcase starts, testResultObject is set; - UT thread does some actions with ArrayList and this causes event generation; - event handler ensures testResultObject is not NULL and continue event handling; - testcases ends and set testResultObject to NULL - event handler tries to set testResultObject field, but it's already NULL and we got this failure. The simplest solution is to update the test to check the thread which generates the event ignoring events from non-test threads
17-12-2021

This assert happens on the "UsageTracker" daemon: Current thread (0x00007f9b8435eca0): JavaThread "UsageTracker" daemon [_thread_in_vm, id=30247, stack(0x00007f9b60592000,0x00007f9b60693000)] The test most probably does not expect this FieldAccess watch event posted on a UT thread. I'll check if it is the case. If so then this is a test issue.
15-12-2021