2017-06-26 12 views
6

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 

答えて

5

私は、この問題は以下のカーネルの問題に関連している疑いがある私は、最新のパッケージにアップデートした後のCentOS 7で同じ問題と思われるものに気付いてい https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1699772

  • のjava -1.8.0-openjdk-1.8.0.131-3.b12.el7_3.x86_64
  • Linux 3.10.0-514-21.2.el7.x86_64

Linux 3.10.0-514-21.1で再起動した場合、問題は解決しません。

+0

スレッドスタックサイズに次の微調整を追加すると、プログラムが再び機能することがわかりました。 opt [optn ++]。optionString = "-Xss1280k"; より長期的な解決策は、CVE-2017-1000364を修正したカーネルパッチがJavaを破棄するのを待つことです。 –

+1

'-Xss1280k'オプションが機能します!私のマシン(failingとok)は同じカーネル( '4.4.0-81-generic')と同じJDKを実行するので、少し謎が残っています。 –

関連する問題