簡體   English   中英

在Eclipse中調試Android NDK C / C ++代碼 - 沒有命中斷點

[英]Debugging Android NDK C/C++ code in Eclipse - breakpoints are not hit

我下載了適用於Linux和Android NDK的Android SDK Bundle。 安裝了ADT,我安裝了CDT。

我創建了一個Android項目並添加了原生支持(jni)。 然后我在java代碼中編寫了本機函數,用c ++代碼導出。 在c ++代碼中我定義了這個函數。

Java的代碼:

static {
    System.loadLibrary("test");
}

private native String get_text_from_cpp();

c ++代碼(h):

extern "C"{
   JNIEXPORT jstring JNICALL Java_com_example_test_MainActivity_get_1text_1from_1cpp(JNIEnv *, jobject);
}

c ++代碼(cpp):

JNIEXPORT jstring JNICALL Java_com_example_test_MainActivity_get_1text_1from_1cpp(JNIEnv * env, jobject){
    return env->NewStringUTF( "hello from C++" );
}

代碼無誤地運行。 但是當我在c ++代碼中設置斷點時,它沒有被擊中。

build-nkd NDK_DEBUG = 1 - 包括在內

我按照說明http://tools.android.com/recent/usingthendkplugin

jni中的Android.mk /具有LOCAL_CFLAGS:= -g

我已經閱讀了很多信息,但我無法定制Eclipse。 請幫助任何人。

PS:對不起,我的英語不是我的母語。 我寫作有困難。

添加:同樣在控制台顯示調試期間:“警告:無法加載95個庫的共享庫符號,例如/ system / bin / linker。使用”info sharedlibrary“命令查看完整列表。是否需要”set solib- search-path“或”set sysroot“?警告:無法找到動態鏈接器斷點函數.GDB將最終重試。同時,很可能GDB無法調試共享庫初始化程序或在dlopen()之后解析掛起的斷點。”

我使用的技巧是將一個usleep調用作為我的調試代碼中的第一個本機行。

這使您的線程處於睡眠狀態,並為調試器提供為您准備的機會。

#include <unistd.h>

.
.
.

#ifndef NDEBUG
usleep(5000 * 1000);
#endif

掙扎了很多 Eclipse的調試后,這是我的食譜:

做通常的步驟:

  • 添加android.os.Debug.waitForDebugger(); 在加載本機庫之前。 這可能有所幫助。
  • Application.mk添加APP_OPTIM := debug
  • 使用ndk-build NDK_DEBUG=1

然后,我發現了不同的東西:

  • 打開控制台並運行:

adb pull /system/bin/linker <your_project_base_dir>/obj/local/armeabi/linker

根據您的設備,您可能需要編寫armeabiarmeabi-v7a 你只需要做一次(我注意到手動運行ndk-gdb正在這樣做。手動執行該命令斷點開始工作)

  • 最后,要調試使用菜單“運行 - >調試為 - > Android本機應用程序”

您可以使用ARM提供的DS-5 CE Android Debug工具作為eclipse的插件。 它工作得非常好,並為調試提供了一個非常好的和簡單的UI。 根據我的個人經驗,它比調試ndk應用程序的傳統方式要好得多。

請參考以下鏈接,它將為您提供有關如何使用DS-5調試器的詳細信息:

https://developer.arm.com/products/software-development-tools/ds-5-development-studio/resources/tutorials/android-native-app-debug-tutorial

您的應用程序很早就執行了JNI函數,因此調試器還沒有准備好。 不幸的是,gdb建立遠程連接需要一段時間,請參閱http://visualgdb.com/documentation/appstartup

而不是對抗風車,為您的活動添加一個按鈕,並在該按鈕的Click()上調用相同的本機方法 - 捕獲斷點將更容易。

BTW,關於95個庫的警告是完全正常的。 這些是您不想調試的系統庫,並且沒有源代碼。

考慮添加:

android.os.Debug.waitForDebugger();

在您的本機通話之前,這會讓您的應用等到調試器附加,可以幫助您避免睡眠/使用按鈕。

我有這個問題,唯一對我有用的就是投入

Thread.sleep(2000);

在加載JNI庫之前。 在調用System.loadLibrary崩潰應用程序之前,這給了調試器足夠的時間來附加。 幫我找到問題C ++代碼。

暫無
暫無

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

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