Java JVMTI代理在GetEnv()上崩溃

时间:2018-01-15 14:55:18

标签: java c java-native-interface jvmti

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

我把它缩小了这条线:

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

这是代理lib的完整代码(在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的问题吗?

由于

1 个答案:

答案 0 :(得分:0)

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

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