2017-06-26 61 views
6

SWI-Prolog Java arabirimi birkaç hafta içinde JNI_CreateJavaVM içinde hemen çöker. Eh, çoğu makinede.JNI_CreateJavaVM() son Ubuntu'da yığın bozulması 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); 
} 

derlenmektedir

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 

Gdb verir kullanarak: O ... Bu küçük program bu soyunmuş Ubuntu ve OpenJDK aynı sürümünü çalıştıran benim makinelerin birinde iyi çalışır JVM'de bir yığın yozlaşması olduğunu iddia ettiği için kullanılabilir yığın izi yok. Hem Oracle hem de OpenJDK java'yı kullanarak çöküşe uğradığım için oldukça kayboldum, biri benim hatam olduğunu varsayar. Öte yandan, bu yıllarca çalıştı ve her örnekte bulduğunuz şeydir.

Platformu 5.4.0

valgrind bu diyor Ubuntu 16.04, amd64'tür, gcc olduğunu. Yeterince komik, çökmeden çalıştığı makinede aynı şeyi söylüyor.

==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 

cevap

5

Bu sorun aşağıdaki çekirdek konuyla ilgili şüpheleniyorsanız Ben son paketlerine güncelledikten sonra CentOS 7'de aynı sorun olduğunu düşünüyorum fark ediyorum 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 ile yeniden başlatırsam sorun gider.

+0

Aşağıdaki tabloyu yığın iş parçacığı boyutuna ekledikten sonra programın tekrar çalıştığını buldum: opt [optn ++]. OptionString = "-Xss1280k"; Uzun vadeli bir çözüm, CVE-2017-1000364'ü Java'yı bozmadan gideren bir çekirdek düzeltme ekini beklemektir. –

+1

'-Xss1280k' seçeneği işe yarıyor! Makinelerim (başarısız ve tamam) aynı çekirdeği ('4.4.0-81-jenerik) ve aynı JDK'yı çalıştırır, bu yüzden biraz gizem kalır. –

İlgili konular