Java JVMTI 代理在 GetEnv() 上崩溃

Java JVMTI Agent crashes on GetEnv()

我在这里完全不知所措。我正在尝试获取 JVMTI 代理库 运行ning,但由于某种原因它一直崩溃。

我已经缩小到这一行:

(*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 输出在崩溃前可见。)

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

或者这可能是我 PC 上 java 安装的问题?

谢谢

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

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