从Visual Studio外部创建JVM崩溃

Create JVM crashs outside from Visual Studio

本文关键字:JVM 崩溃 创建 外部 Visual Studio      更新时间:2023-10-16

我有以下问题。我写了一个小应用程序,它创建了一个Java虚拟机。如果我在Visual Studio中启动这个程序,它运行得很好。但如果我在visualstudio之外启动它,程序就不起作用,并且我有一个ntdll.dll崩溃。

这是我的代码:

    int result = 0;
LoadRuntimeLibrary(libPath);

// Load the JVM library 
g_jniLibrary = LoadLibrary(libPath);
if (g_jniLibrary == NULL) {
    info->Error("Could not load libary: ");
    return -1;
}
// Grab the create VM function address
JNI_createJavaVM createJavaVM = (JNI_createJavaVM)GetProcAddress(g_jniLibrary, "JNI_CreateJavaVM");
if (createJavaVM == NULL) {
    info->Error("ERROR: Could not find JNI_CreateJavaVM function");
    return -1;
}
// Count the vm args
int numVMArgs = -1;
while (vmArgs[++numVMArgs] != NULL) {}
// Add the options for exit and abort hooks
int numHooks = 0;
JavaVMOption* options = (JavaVMOption*)malloc((numVMArgs + numHooks) * sizeof(JavaVMOption));
for (int i = 0; i < numVMArgs; i++){
    options[i].optionString = vmArgs[i];
    options[i].extraInfo = 0;
}

// Setup hook pointers
options[numVMArgs].optionString = "abort";
options[numVMArgs].extraInfo = (void*)&AbortHook;
options[numVMArgs + 1].optionString = "exit";
options[numVMArgs + 1].extraInfo = (void*)&ExitHook;
JavaVMInitArgs init_args;
memset(&init_args, 0, sizeof(init_args));
init_args.version = JNI_VERSION_1_8;
init_args.options = options;
init_args.nOptions = numVMArgs + numHooks;
init_args.ignoreUnrecognized = JNI_FALSE;

result = createJavaVM(&jvm, &env, &init_args); // here is the crash


 env = GetJNIEnv(false);

Init(env);

result = RunMainClass(env, mainCls, argc, javaargs);
jvm->DestroyJavaVM();
FreeLibrary(g_jniLibrary);
return result;

我希望你有任何想法,什么可能是错误的

您正在越界访问options数组。它只包含numVMArgs元素,因为numHooks为零。

当你进行时,这当然会导致未定义的行为

options[numVMArgs].optionString = "abort";
options[numVMArgs].extraInfo = (void*)&AbortHook;
options[numVMArgs + 1].optionString = "exit";
options[numVMArgs + 1].extraInfo = (void*)&ExitHook;

因为索引CCD_ 4和CCD_。