簡體   English   中英

如何使用GDB從本機調用調試到java函數?

[英]how to debug into the java function from native call with GDB?

在那里,我有一個C ++函數調用這樣的Java模塊。 我的問題是如何調試java代碼? 在程序中,有一個“JNI_CreateJavaVM()”函數調用來創建VM並將Java類加載到其中。 然后我用GDB進入下面的代碼。 這對我來說真是一招。 請給我一些想法。 非常感謝!

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);
}

如果將正確的選項傳遞給JNI_CreateJavaVM()那么JVM將可以使用Java調試器進行調試。

不要嘗試使用GDB調試JVM; 那種方式就是瘋狂。

我假設你的manline是c ++?

如果是這樣,這是相當簡單的:

修改你的代碼,以便用調試選項調用jvm,例如.... agentlib:jdwp = transport = dt_socket,server = y, suspend = y ,address = 60666

用gdb啟動你的程序,或者如果你不想調試你的c ++代碼就沒有。 當你的c ++代碼啟動jvm時,它將開始暫停。

在那一點上附上java調試器,用你的java源碼開始調試。

盡管有一些復雜性,但這只是一個標准的調試方案(在其他地方做得很好)。 你的jvm如何推出有什么不同之處。 所有調試功能都應該適合您,包括代替代碼,重置堆棧周期

我很確定你不能用GDB做到這一點。 使用Java調試器來調試Java代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM