ネイティブライブラリ内で意図的にSEGVを起こすJNIライブラリです。Javaのクラッシュ時の挙動の確認などにご利用ください。
$ export JAVA_HOME
$ cd build
$ cmake ..
$ make
$ java -Djava.library.path=. -jar NativeSEGV.jar
$ java -Djava.library.path=. -jar NativeSEGV.jar -l
-s
オプションを追加してください
$ java -Djava.library.path=. -jar NativeSEGV.jar -s
$ java -Djava.library.path=. -jar NativeSEGV.jar -l -s
%JAVA_HOME%
設定後、Visual StudioでNativeSEGVを開いてください。CMakeプロジェクトとして認識されます。Visual Studioでビルドすると out\build
配下にバイナリが出力されます。
OpenJDK 17のオフィシャルイメージ(Alpine版)の中でクラッシュさせることもできます。このとき、hs_errログは -XX:+ErrorFileToStderr
により標準エラー出力に出力されます。
$ cd container
$ buildah bud --layers -t javacrash:jdk17
$ podman run -it --rm javacrash:jdk17
Java 22 から Foreign Function & Memory API が導入されました。 NULL
を表現する MemorySegment.NULL に書き込みオペレーションを実行したときに SEGV を起こします。
cd ffm
java SegvInFFM.java
upcall 内での SEGV を確認するには upcall を実行します。
cd ffm/upcall
mvn package
mvn exec:java
Tip
クラッシュしたときのコアイメージなど jhsdb jstack
でコールスタックを取得しようとすると、動的生成される Upcall 用スタブコードから下のコールスタックを取得できない可能性があります。この問題は JDK-8339307 で修正されており、Java 24 から正式に織り込まれる予定です。