我在这里全亏了。我正在尝试运行JVMTI代理库,但由于某些原因它一直崩溃。

我将其范围缩小了:

(*jvm)->GetEnv(jvm, (void**)jvmti, JVMTI_VERSION_1_0);


这是代理库(在C中)的完整代码:

#include <jvmti.h>
#include <stdlib.h>


jvmtiEnv* jvmti = NULL;


JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *jvm, char *options, void *reserved)
{
    printf("Agent started.\n");
    _flushall();
    jint err = (*jvm)->GetEnv(jvm, (void**)jvmti, JVMTI_VERSION_1_0);
    if (err != JNI_OK)
    {
        printf("Failed to get JVMTI env!\n");
        _flushall();
        return err;
    }

    return JNI_OK;
}

JNIEXPORT jint JNICALL Agent_OnAttach(JavaVM* vm, char* options, void* reserved)
{
    return JNI_OK;
}

JNIEXPORT void JNICALL Agent_OnUnload(JavaVM *vm)
{
}


当我试图找出问题所在时,我编写了一个非常简单的Java应用进行测试
这与:

public class Test
{
    public static void main(String[] args)
    {
        System.out.println("Hello from java!");

    }
}


如果我是通过netbeans将VM arg -agentpath设置为包含以上代码的.dll来运行的,则该应用程序在尝试调用GetEnv()时似乎崩溃了。

我已经确保以下几点:
-JVM和dll均为64bit
-绝对可以找到并加载该库(崩溃前可以看到printf输出。)

我不知道还有什么可能导致此问题,我是否必须链接到一些我不知道的JVMTI API库?

还是这可能是我的PC上的Java安装出现问题?

谢谢

最佳答案

您应该将jvmti的地址传递给GetEnv(),如下所示:

jint err = (*jvm)->GetEnv(jvm, (void**) &jvmti, JVMTI_VERSION_1_0);

10-04 20:13