OpenJDK 18 Linux Bug when Wrapping Clang, Crashes Outside Native Frames

Maurizio Cimadamore maurizio.cimadamore at oracle.com
Mon Jul 18 17:14:46 UTC 2022


Hi again,
I've tried your Panama-only reproducer and I can confirm that the crash 
disappears if you prepend `LIBCLANG_DISABLE_CRASH_RECOVERY=false` to 
your launcher, as in:

LIBCLANG_DISABLE_CRASH_RECOVERY=false java 
-Djava.library.path=<path-to-LLVM-libs> 
--enable-native-access=ALL-UNNAMED --add-modules jdk.incubator.foreign 
MinimalReproductionCase complex.cpp

Maurizio


On 18/07/2022 17:43, Maurizio Cimadamore wrote:
>
> Hi Joshua,
> I know about coffi, and very excited to see stuff like these happening 
> - kudos!
>
> As for clang, my hunch is that you are hitting the dreaded "libclang 
> crash recovery" issue - e.g.
>
> https://reviews.llvm.org/D23662
>
> Basically, clang installs its own signal handlers, which end up 
> overriding (at least on Linux) the signal handlers installed by the JVM.
>
> Our Jextract implementation (which is based on a Panama port of 
> libclang) has also to workaround this:
>
> https://github.com/openjdk/jextract/blob/master/src/main/java/org/openjdk/jextract/clang/LibClang.java#L54
>
> (On windows, the recovery logic seems to work ok, but on Linux it 
> causes spurious crashes, pretty much all over the place).
>
> In principle, setting the LIBCLANG_DISABLE_CRASH_RECOVERY variable 
> should be a quick way for you to check if that's indeed the issue.
>
> Cheers
> Maurizio
>
> On 18/07/2022 17:16, Joshua Suskalo wrote:
>> This is the first time I've posted to the panama-dev mailing list, so 
>> if this isn't the right place for this, please forgive me.
>>
>> I've been working fairly happily with Panama (sans not liking that 
>> Addressable was made sealed in JDK 18) since JDK 17 building a 
>> wrapper for it in Clojure called coffi[1], but I've recently run into 
>> a bug that's a bit outside of what I think I can solve. I'm fairly 
>> sure it's not an error in how I'm using Panama (although tracking it 
>> down has helped me find and fix some bugs in coffi), and I've been 
>> able to reproduce it in a short plain Java file.
>>
>> I have a full listing for a Clojure reproduction case using coffi, a 
>> Java reproduction case using Panama directly, and a C version that 
>> appears to work just fine, as well as some test cpp files to use as 
>> inputs, all available in a paste on sourcehut[2]. The first argument 
>> to running them is the filename to parse. To run the Clojure version 
>> you only need to have the Clojure CLI installed (available from most 
>> package managers), mark the file executable, and run it as a script.
>>
>> The problem is that when calling functions from clang's C api[3], the 
>> JVM appears to enter a corrupted state that will eventually crash 
>> with a SIGSEGV. Usually in my experience this happens outside of 
>> native stack frames, and when working locally in a REPL in Clojure 
>> the actual crash that occurred seemed non-deterministic, though that 
>> likely just had to do with slightly different inputs to the system, 
>> as the reproduction case I've included[2] appears to have 
>> deterministic behavior on my machine.
>>
>> Notably I have not observed similar behavior with other C libraries, 
>> including ones which use upcalls, which means that this *may* simply 
>> be an issue of clang corrupting memory through its normal use that 
>> causes problems with the JVM but which does not affect the C runtime. 
>> Unfortunately I don't know how to test that theory. I also believe I 
>> have determined that this is not caused by the native threads in 
>> clang, as disabling threading by passing the arguments 
>> `-mthread-model single` to the parsing does not appear to prevent a 
>> crash, although in my limited testing it *did* appear to increase the 
>> delay between running the native code and the JVM crashing.
>>
>> Thanks for your time and for reading,
>> Joshua Suskalo
>>
>> [1]: https://github.com/IGJoshua/coffi
>> [2]: https://paste.sr.ht/~srasu/80750a5513bb5e175169465875a155136aad44d7
>> [3]: https://clang.llvm.org/doxygen/index.html
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/panama-dev/attachments/20220718/53dd4f86/attachment-0001.htm>


More information about the panama-dev mailing list