2011-11-03 125 views
0

那里, 我有一个C++函数调用转换为Java模块这个样子。我的问题是如何调试到java代码?在程序中,有一个“JNI_CreateJavaVM()”函数调用来创建VM并将Java类加载到其中。我用GDB进入下面的代码。 这对我来说真是一招。请给我一些想法。非常感谢!如何通过本地调用GDB来调试java函数?

void functions::call(jobject jo, const Parameter_list& parameter_list) const 
{ 
    Env env; 
    env->CallVoidMethodA(jo, id(), JVALUES_CAST(parameter_list.jvalue_array())); 
    if(env->ExceptionCheck()) env.throw_java("CallVoidMethodA"); 
} 
jni.h: 
void CallVoidMethodA(jobject obj, jmethodID methodID, 
     const jvalue * args) { 
    functions->CallVoidMethodA(this,obj,methodID,args); 
} 

回答

0

我确定你不能使用GDB来做到这一点。使用Java调试器来调试Java代码。

+0

如果基于C/C++的JVM,我将能够尽可能接近去Java线程在里面。可能是我应该采取另一种方式使用JDB附加到JVM,并在某处查看JVM如何运行该调用。不太清楚如何做到这一点仍然谷歌和寻找线索。 –

1

如果您将right options传递给JNI_CreateJavaVM(),那么JVM将通过Java调试器进行调试。

不要试图调试与GDB的JVM;这种方式是疯狂。

+0

我100%同意:) – Andro

0

我假设你manline在C++中?

如果是这样,这是相当简单:

修改代码,这样JVM与调试选项调用,像.... agentlib:JDWP = =运输dt_socket,服务器= Y,暂停=如果你不想调试你的C++代码Ÿ,地址= 60666

使用gdb启动程序,或没有。当你的C++代码启动jvm时,它将开始暂停。

在这一点上附着的Java调试器,与Java源并开始调试。

尽管有些复杂,这仅仅是一个标准的调试方案(以及其他地方documneted)。你的jvm如何启动有什么不同。所有调试功能应该为你工作,包括在适当位置代码替换,复位堆栈周期