2016-03-27 16 views
6

Aşağıdaki C++ kodunu kullanarak Java VM'yi başlatıyorum. JNI_CreateJavaVM, 0xC0000005 istisnasını atar, ancak yoksayırsa, onu yoksayır.JNI_CreateJavaVM (jvm.dll) için 0xC0000005 İstisnası

'Jni.exe' (Win32): Loaded 'C: Java \ Jdk8.77x86 \ jre bin \ zip.dll \ \ \ Tools'. PDB dosyasını bulamıyor veya açamıyor.

Jni.exe'de 0x02900282 adresinde atılan özel durum: 0xC0000005: Erişim ihlali okuma konumu 0x00000000.

'Jni.exe' (Win32): 'C: \ Windows \ SysWOW64 \ shell32.dll' yüklendi. PDB dosyasını bulamıyor veya açamıyor.

Bir şeyi ayarlamayı veya yapmayı unutmayı mı yoksa bu 'normal' davranışı mı?

#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();   
    } 
} 

Bu, hem Release hem de Debug ve hem de x86 ve x64 yapıları için geçerlidir.

+0

MSVC içinde değil, programı tek başına çalıştırırsanız istisna gerçekleşir mi? – apangin

+0

@apangin Özel durum, jvm.dll dosyasında ele alınmıştır. Program çökmez. İyi çalışıyor. MSVC'siz istisnayı nasıl tespit edebilirim? Win32 Exceptions altında C00000005'i devre dışı bırakırsam, mesele yalnızca Çıkış konsolunda görünür ve hiçbir kesinti yoktur – Thomas

cevap

9

JVM aktif kendi amaçları için (Windows terminolojisi veya özel durumlar) işletim sinyalleri kullanır: kapalı boş gösterici kontrol ve yığın taşma kontroller için

  • ; Güvenli nokta sorgulaması için
  • ; Uzak bellek engelleri için
  • ;
  • vb

SEGV (veya istisna 0xC0000005) aynı zamanda belirli CPU/işletim sistemi özelliklerinden doğrulamak için JVM başlangıçta kasıtlı oluşturulur. Bazı OS'lerde veya hipervizörlerde, AVX kayıtlarının sinyal işlemeden sonra geri yüklenmediği bir hata vardı. Bu nedenle, JVM'nin bu durumun (the source) olup olmadığını kontrol etmesi gerekir. Bu yüzden sıfır adrese yazarak bir istisna oluşturur ve sonra onu işler.

Bu, sizin durumunuzda olan şeydir. Ve evet, normaldir.

+2

Peki, Visual Studio hata ayıklayıcısını bunu atlamak için nasıl yapabilirim? – Halil