2016-03-27 8 views
6

Ich initialisiere die Java-VM mit dem folgenden C++ - Code. JNI_CreateJavaVM löst eine 0xC0000005 Ausnahme aus, ist aber trotzdem erfolgreich, wenn ich sie ignoriere.Ausnahme 0xC0000005 von JNI_CreateJavaVM (jvm.dll)

'Jni.exe' (Win32): Geladen 'C: \ Tools \ Java \ Jdk8.77x86 \ jre \ bin \ zip.dll'. Die PDB-Datei kann nicht gefunden oder geöffnet werden.

Ausnahme bei 0x02900282 in Jni.exe geworfen: 0xC0000005: Zugriffsverletzung beim Lesen der Position 0x00000000.

'Jni.exe' (Win32): Geladen 'C: \ Windows \ SysWOW64 \ shell32.dll'. Die PDB-Datei kann nicht gefunden oder geöffnet werden.

Vergesse ich, etwas zu setzen oder zu tun oder ist das "normales" Verhalten?

#include <array> 
#include "jni.h" 

int main(int argc, char const* args[]) 
{ 
    JavaVM* jvm; 
    JNIEnv* env; 

    std::array<JavaVMOption,1> options; 
    options[0].optionString = "-Djava.class.path=C:/Users/Thomas/Documents/Visual Studio 2015/Projects/Jni/x64/Debug"; 
    options[0].extraInfo = nullptr; 

    JavaVMInitArgs vm_args; 
    vm_args.version = JNI_VERSION_1_8; 
    vm_args.options = options.data(); 
    vm_args.nOptions = options.size(); 
    vm_args.ignoreUnrecognized = false; 

    auto rc = JNI_CreateJavaVM(&jvm, reinterpret_cast<void**>(&env), &vm_args); 
    if(rc == JNI_OK) 
    { 
     jvm->DestroyJavaVM();   
    } 
} 

Dies geschieht sowohl für Release und Debug und für beide x86 und x64-Builds.

+0

Tritt die Ausnahme auf, wenn Sie das Programm eigenständig ausführen, nicht in MSVC? – apangin

+0

@apangin Die Ausnahme wird in jvm.dll behandelt. Das Programm stürzt nicht ab. Es funktioniert gut. Wie würde ich die Ausnahme ohne MSVC erkennen? Wenn ich C00000005 unter Win32-Ausnahmen deaktiviere, taucht die Meldung nur in der Ausgabekonsole auf, und es gibt keine Unterbrechung. – Thomas

Antwort

9

JVM verwendet aktiv OS-Signale (oder Ausnahmen in der Terminologie Windows) für seine eigenen Zwecke:

  • für implizite Null-Zeiger überprüft und Stapelüberlauf überprüft;
  • für Safepoint-Abfrage;
  • für entfernte Speicherbarrieren;
  • usw.

SEGV (oder Ausnahme 0xC0000005) auch absichtlich auf JVM Start erzeugt wird, um bestimmte CPU/OS-Funktionen zu überprüfen. Einige Betriebssysteme oder Hypervisoren hatten einen Fehler, dass AVX-Register nach der Signalverarbeitung nicht wiederhergestellt wurden. Daher muss JVM prüfen, ob dies der Fall (the source) ist. Es erzeugt also eine Ausnahme, indem es auf Null schreibt und dann behandelt.

Das passiert in Ihrem Fall. Und ja, das ist normal.

+2

Wie kann ich den Visual Studio-Debugger dazu bringen, dies zu überspringen? – Halil

Verwandte Themen