2011-11-03 38 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如何啓動有什麼不同。所有調試功能應該爲你工作,包括在適當位置代碼替換,復位堆棧週期