2017-06-26 30 views
6

में भ्रष्टाचार ढेर कुछ हफ्तों के बाद से एसडब्ल्यूआई-प्रोलॉग जावा इंटरफेस JNI_CreateJavaVM में तुरंत दुर्घटनाग्रस्त हो गया। खैर, ज्यादातर मशीनों पर। यह मेरी मशीनों, जो Ubuntu और openjdk के समान संस्करण चलाता है में से एक पर ठीक चलाता है ... मैं इस इस छोटे से कार्यक्रम के लिए नीचे छीन लिया:जेएनआई_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); 
} 

संकलित किया गया है कि का उपयोग कर

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 देता है कोई उपयोग करने योग्य स्टैक ट्रेस नहीं है क्योंकि यह जेवीएम में कहीं स्टैक भ्रष्टाचार का दावा करता है। मैं बहुत खो गया हूं क्योंकि ओरेकल और ओपनजेडीके जावा का उपयोग करके यह दुर्घटनाग्रस्त हो जाता है, मान लीजिए कि यह मेरी गलती है। दूसरी तरफ, यह वर्षों से काम करता है और यह भी आपको सभी उदाहरणों में मिलता है।

मंच उबंटू 16.04, amd64, जीसीसी है 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

मैं इस समस्या को निम्नलिखित गिरी समस्या से संबंधित है पर शक https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1699772

मैं देख रहा हूँ कि मैं क्या लगता है कि नवीनतम संकुल को अद्यतन करने के बाद CentOS 7 में एक ही मुद्दा है:

  • जावा -1.8.0-openjdk-1.8.0.131-3.b12.el7_3.x86_64
  • लिनक्स 3.10.0-514-21.2.el7.x86_64

यदि मैं लिनक्स 3.10.0-514-21.1 के साथ रीबूट करता हूं तो समस्या दूर हो जाती है।

+0

मैंने पाया कि थ्रेड स्टैक आकार में निम्न ट्वीक जोड़ने से प्रोग्राम फिर से काम कर रहा है: ऑप्ट [optn ++] विकल्प। विकल्प = "-Xss1280k"; एक दीर्घकालिक समाधान कर्नेल पैच की प्रतीक्षा करना है जो जावा को बस्ट किए बिना सीवीई-2017-1000364 को ठीक करता है। –

+1

'-Xss1280k' विकल्प काम करता है! मेरी मशीनें (असफल और ठीक) दोनों एक ही कर्नेल ('4.4.0-81-जेनेरिक ') और एक ही जेडीके चलाती हैं, इसलिए यह एक छोटा सा रहस्य बना रहता है। –

संबंधित मुद्दे