来自 JNI_CreateJavaVM (jvm.dll) 的异常 0xC0000005
Exception 0xC0000005 from JNI_CreateJavaVM (jvm.dll)
我正在使用以下 C++ 代码初始化 Java 虚拟机。 JNI_CreateJavaVM
抛出 0xC0000005
异常,但如果我忽略它,则成功 none 越少。
'Jni.exe' (Win32): Loaded 'C:\Tools\Java\Jdk8.77x86\jre\bin\zip.dll'. Cannot find or open the PDB file.
Exception thrown at 0x02900282 in Jni.exe: 0xC0000005: Access violation reading location 0x00000000.
'Jni.exe' (Win32): Loaded 'C:\Windows\SysWOW64\shell32.dll'. Cannot find or open the PDB file.
我是不是忘记设置或做某事,或者这是 'normal' 行为?
#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();
}
}
发布和调试以及 x86 和 x64 构建都会发生这种情况。
JVM 为自己的目的主动使用 OS 信号(或 Windows 术语中的异常):
- 用于隐式空指针检查和堆栈溢出检查;
- 用于安全点轮询;
- 用于远程内存屏障;
- 等等
SEGV(或异常 0xC0000005)也是在 JVM 启动时有意生成的,以验证某些 CPU/OS 功能。一些 OSes 或管理程序有一个错误,即 AVX 寄存器在信号处理后没有恢复。因此,JVM需要检查是否是这种情况(the source)。所以它通过写入零地址产生异常然后处理它。
这就是您的情况。是的,这很正常。
这很正常,就像@apangin 说的。如果你想在 VisualStudio (2017) 中关闭所有 0xC0000005 异常,你可以这样做:
- 异常设置 - Ctrl+Alt+E
- 从 Win32 异常下的“0xc0000005 访问冲突”中删除勾号
我正在使用以下 C++ 代码初始化 Java 虚拟机。 JNI_CreateJavaVM
抛出 0xC0000005
异常,但如果我忽略它,则成功 none 越少。
'Jni.exe' (Win32): Loaded 'C:\Tools\Java\Jdk8.77x86\jre\bin\zip.dll'. Cannot find or open the PDB file.
Exception thrown at 0x02900282 in Jni.exe: 0xC0000005: Access violation reading location 0x00000000.
'Jni.exe' (Win32): Loaded 'C:\Windows\SysWOW64\shell32.dll'. Cannot find or open the PDB file.
我是不是忘记设置或做某事,或者这是 'normal' 行为?
#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();
}
}
发布和调试以及 x86 和 x64 构建都会发生这种情况。
JVM 为自己的目的主动使用 OS 信号(或 Windows 术语中的异常):
- 用于隐式空指针检查和堆栈溢出检查;
- 用于安全点轮询;
- 用于远程内存屏障;
- 等等
SEGV(或异常 0xC0000005)也是在 JVM 启动时有意生成的,以验证某些 CPU/OS 功能。一些 OSes 或管理程序有一个错误,即 AVX 寄存器在信号处理后没有恢复。因此,JVM需要检查是否是这种情况(the source)。所以它通过写入零地址产生异常然后处理它。
这就是您的情况。是的,这很正常。
这很正常,就像@apangin 说的。如果你想在 VisualStudio (2017) 中关闭所有 0xC0000005 异常,你可以这样做:
- 异常设置 - Ctrl+Alt+E
- 从 Win32 异常下的“0xc0000005 访问冲突”中删除勾号