首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java JVMTI代理在GetEnv()上崩溃

Java JVMTI代理在GetEnv()上崩溃
EN

Stack Overflow用户
提问于 2018-01-15 22:55:18
回答 1查看 303关注 0票数 0

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

我把范围缩小到这条线上:

代码语言:javascript
复制
(*jvm)->GetEnv(jvm, (void**)jvmti, JVMTI_VERSION_1_0);

这是代理库的完整代码(用C编写):

代码语言:javascript
复制
#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应用程序来测试这个问题:

代码语言:javascript
复制
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库?

或者这会不会是我电脑上的java安装出了问题?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-19 03:44:55

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48265418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档