SWI-Prolog Javaインターフェイスがすぐにクラッシュし、JNI_CreateJavaVM
になってしまいました。よく、ほとんどのマシンで。私はこの小さなプログラムにこれをダウン剥奪... UbuntuとのOpenJDKの同じバージョンを実行している、私のマシンのいずれかに罰金それを実行します:最近のUbuntuのJNI_CreateJavaVM()スタックの破損16.04
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
static JavaVM *jvm;
int
main(int argc, char **argv)
{ JavaVMInitArgs vm_args = {0};
JNIEnv *env;
JavaVMOption opt[8] = {0};
int optn = 0;
int r;
opt[optn++].optionString = "-Djava.class.path=" "jpl.jar:.";
opt[optn++].optionString = "-Xrs";
vm_args.version = JNI_VERSION_1_2;
vm_args.nOptions = optn;
vm_args.options = opt;
r = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args);
fprintf(stderr, "Got %d\n", r);
exit(0);
}
GDBが与え
JVM=/usr/lib/jvm/java-8-oracle
#JVM=/usr/lib/jvm/java-1.8.0-openjdk-amd64
gcc -I$JVM/include \
-I$JVM/include/linux \
-L$JVM/jre/lib/amd64/server \
-L$JVM/jre/lib/amd64 \
-g -Wall -o t t.c -ljsig -ljava -lverify -ljvm
を使用してコンパイルされていることJVMのどこかにスタックの破損があると主張するので、使用可能なスタックトレースはありません。私はかなりクラッシュOracleとOpenJDKのJavaを使用してクラッシュするので、私はそれが自分の責任であると仮定して失われます。一方、これは何年も働いており、すべての例でも同様です。
プラットフォームのUbuntu 16.04、AMD64で、GCC 5.4.0
valgrind
はこれを言います。面白いことに、それはクラッシュせずに実行されるマシンでも同じことを言います。
==9642== Memcheck, a memory error detector
==9642== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==9642== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==9642== Command: ./t
==9642==
==9642== Warning: set address range perms: large range [0x5cb200000, 0x7c0000000) (noaccess)
==9642== Warning: set address range perms: large range [0x5cb200000, 0x5e0100000) (defined)
==9642== Warning: set address range perms: large range [0x7c0000000, 0x800000000) (noaccess)
==9642== Invalid write of size 4
==9642== at 0x84C0BE7: ???
==9642== by 0x84AE4E6: ???
==9642== by 0x549C11A: ??? (in /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so)
==9642== by 0x545ABA6: ??? (in /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so)
==9642== by 0x545AFA1: ??? (in /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so)
==9642== by 0x545B3FF: ??? (in /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so)
==9642== by 0x545B1B1: ??? (in /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so)
==9642== by 0x545B3FF: ??? (in /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so)
==9642== by 0x584A9BB: ??? (in /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so)
==9642== by 0x54C31E1: JNI_CreateJavaVM (in /usr/lib/jvm/java-8-openjdk-amd64/jre/lib/amd64/server/libjvm.so)
==9642== by 0x4007C7: main (t.c:22)
==9642== Address 0xffeffea00 is on thread 1's stack
==9642== 4096 bytes below stack pointer
スレッドスタックサイズに次の微調整を追加すると、プログラムが再び機能することがわかりました。 opt [optn ++]。optionString = "-Xss1280k"; より長期的な解決策は、CVE-2017-1000364を修正したカーネルパッチがJavaを破棄するのを待つことです。 –
'-Xss1280k'オプションが機能します!私のマシン(failingとok)は同じカーネル( '4.4.0-81-generic')と同じJDKを実行するので、少し謎が残っています。 –