Native crash running Java.Interop.Export-Tests.dll tests
When CI is running bin/TestDebug/Java.Interop.Export-Tests.dll on Mac, there's about a 25% chance it fails with this native crash:
* Assertion: should not be reached at class-accessors.c:81
=================================================================
Native Crash Reporting
=================================================================
Got a SIGABRT while executing native code. This usually indicates
a fatal error in the mono runtime or one of the native libraries
used by your application.
=================================================================
=================================================================
Native stacktrace:
=================================================================
0x102d2091b - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono : mono_dump_native_crash_info
0x102cb97b5 - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono : mono_handle_native_crash
0x102d1fe71 - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono : sigabrt_signal_handler
0x7fff79156b5d - /usr/lib/system/libsystem_platform.dylib : _sigtramp
0x10a126f87 - Unknown
0x7fff790106a6 - /usr/lib/system/libsystem_c.dylib : abort
0x102f28837 - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono : monoeg_assert_abort
0x102f09a9f - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono : mono_log_write_logfile
0x102f28bbe - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono : monoeg_g_logv_nofree
0x102f28d3f - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono : monoeg_assertion_message
0x102db6ee5 - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono : mono_class_get_flags
0x102dac83b - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono : mono_class_setup_fields
0x102dacdc1 - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono : mono_class_init_internal
0x102da7e7f - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono : mono_class_is_subclass_of_internal
0x102e2e4f3 - /Library/Frameworks/Mono.framework/Versions/Current/Commands/mono : mono_class_is_subclass_of
0x106bf1348 - /Users/runner/runners/2.160.0/work/1/s/bin/TestDebug/libjava-interop.dylib : _ZL19get_gc_bridge_indexP19JavaInteropGCBridgeP10_MonoClass
0x106bf0a4c - /Users/runner/runners/2.160.0/work/1/s/bin/TestDebug/libjava-interop.dylib : _ZL20gc_bridge_class_kindP10_MonoClass
SIGQUIT: [libjvm.dylib+0x49bf1d], sa_mask[0]=11111111011111110111111111111111, sa_flags=SA_RESTART|SA_SIGINFO
Start time: 2019-11-04 19:57:01Z
End time: 2019-11-04 19:57:02Z
Duration: 1.803 seconds
Some examples:
- https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=3212341
- https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=3202439
- https://devdiv.visualstudio.com/DevDiv/_build/results?buildId=3201283
Related: https://github.com/mono/mono/issues/14190
The crash appears to happen because we're trying to do a GC during process shutdown.
Possible WorkAround: Don't Do That™. If we could tell if mono were shutting down the process, we could skip the entire GC infrastructure -- not GC'ing -- during process shutdown, thus avoiding the crash.
The question is, How do we tell if the process is shutting down. Looks like the only public mechanism is to use the "profiler", with the MonoProfilerRuntimeShutdownCallback event.
Looks like there should be a mono_profiler_set_runtime_shutdown_callback() function...?