【问题标题】:Java JVMTI Agent crashes on GetEnv()Java JVMTI 代理在 GetEnv() 上崩溃
【发布时间】:2018-01-15 14:55:18
【问题描述】:

我在这里完全不知所措。我正在尝试运行 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 的问题?

谢谢

【问题讨论】:

    标签: java c java-native-interface jvmti


    【解决方案1】:

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

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

    【讨论】:

    • 天啊,我不敢相信我怎么没有注意到这一点。谢谢,这解决了。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2012-08-30
    • 2021-07-27
    • 2015-09-24
    • 2019-07-21
    • 1970-01-01
    相关资源
    最近更新 更多