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);
我在这里完全不知所措。我正在尝试获取 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);