2017-03-04 111 views
0

如何使用Eclipse调试在我自己的C++ - 创建的JVM中运行的Java代码? 我有一个本地应用程序做以下几件事:如何调试在本机代码创建的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代码在良好的条件,每天的基础上。

我的问题是:我怎么能设置的东西吗?

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

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

我发现的唯一的事情就是远程相似,我的问题是

Debug a java application without starting the JVM with debug arguments

,问题是9岁。

最佳,

MF

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

回答

2

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

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

JDWP需要一些JVM TI cababilities这仅适用于VM启动。这意味着如果在没有JDWP代理的情况下启动JVM,则不能在后面附加调试器。

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