में भ्रष्टाचार ढेर कुछ हफ्तों के बाद से एसडब्ल्यूआई-प्रोलॉग जावा इंटरफेस 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
मैंने पाया कि थ्रेड स्टैक आकार में निम्न ट्वीक जोड़ने से प्रोग्राम फिर से काम कर रहा है: ऑप्ट [optn ++] विकल्प। विकल्प = "-Xss1280k"; एक दीर्घकालिक समाधान कर्नेल पैच की प्रतीक्षा करना है जो जावा को बस्ट किए बिना सीवीई-2017-1000364 को ठीक करता है। –
'-Xss1280k' विकल्प काम करता है! मेरी मशीनें (असफल और ठीक) दोनों एक ही कर्नेल ('4.4.0-81-जेनेरिक ') और एक ही जेडीके चलाती हैं, इसलिए यह एक छोटा सा रहस्य बना रहता है। –