如何调试在本机代码创建的JVM中运行的Java代码?

时间:2017-03-04 08:45:05

标签: eclipse debugging jvm java-native-interface

如何使用Eclipse调试在我自己的C ++创建的JVM中运行的Java代码? 我有一个本机应用程序执行以下操作:

JavaVM *javaVM;
JNIEnv *jniEnv;
long flag = JNI_CreateJavaVM(&javaVM, (void**) &jniEnv, &vmArgs);
jclass jcls = env->FindClass("my/namespace/Demo");
// then run code 
[...]

我从那里运行了一些Java代码。 至关重要的是,我有一个完整的Eclipse环境和调试器,这样我就可以每天在良好的条件下编写和调试我的Java代码。

我的问题如下:我如何设置?

例如,在使用Visual Studio的Windows上,我可以:

  • 在C ++应用程序中创建.NET VM
  • 编写一些要从此VM运行的C#代码。
  • 调试我的C#代码,它将托管在DLL(显然不是JAR)中,我只需要指定调试器应该启动C ++应用程序可执行文件。我开始调试时会自动到达C#断点。我也可以使用::DebugBreak()工具(或C#等价物)。

我发现的唯一与我的问题类似的是

Debug a java application without starting the JVM with debug arguments

问题是9岁。

最佳,

MF

注意:请注意,我不是要尝试调试从Java应用程序运行的JNI C ++代码。我在我的问题中添加了jni标记,因为我怀疑JNI人员可以在这里提供帮助。

1 个答案:

答案 0 :(得分:2)

为了使用Eclipse的完整Java调试功能,您需要使用JDWP代理启动JVM,即传递以下JVM参数:

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9999

JDWP需要一些仅在VM启动时可用的JVM TI可用性。这意味着如果在没有JDWP代理的情况下启动JVM,则以后无法附加调试器。

我建议设置一些命令行参数或环境变量,以指示您的C ++程序在创建JVM之前应将上述agentlib参数添加到vmArgs。然后,您将能够将Java调试器附加到address参数中指定的端口。