2014-02-27 113 views
0

我在使用GDB(在Windows上)調試我的本機應用程序時遇到困難,請原諒本文的篇幅。我正在使用標準設置(Eclipse with ADT,ndk-build)。我的生成命令是:Android NDK和GDB調試

ndk-build NDK_DEBUG=1 V=1 

,這裏是我的Android.mk和Application.mk文件:

Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

FILE_LIST := $(wildcard $(LOCAL_PATH)/../../source/*.cpp) 
FILE_LIST += $(wildcard $(LOCAL_PATH)/../../source/android/*.cpp) 

LOCAL_MODULE  := RAGEAndroid 
LOCAL_SRC_FILES  := $(FILE_LIST:$(LOCAL_PATH)/%=%) 

LOCAL_LDLIBS  := -llog -landroid -lm -lEGL -lGLESv3 
LOCAL_STATIC_LIBRARIES := android_native_app_glue 

LOCAL_CPPFLAGS  := -std=c++11 -pthread -DRAGE_ANDROID #-ftemplate-backtrace-limit=0 
ifeq ($(NDK_DEBUG),1) 
    LOCAL_CPPFLAGS  += -DRAGE_DEBUG 
endif 

include $(BUILD_SHARED_LIBRARY) 

$(call import-module,android/native_app_glue) 

Application.mk

APP_STL     := gnustl_static 
NDK_TOOLCHAIN_VERSION := 4.8 
APP_ABI     := armeabi-v7a 
APP_PLATFORM   := android-18 

Ve rbose模式在構建過程中輸出以下內容(現在僅顯示單個文件的構建,請注意,我只顯示了一個.o文件被鏈接並省略其餘部分,以便使用標記#OMITTED OTHER .O FILES#)輕鬆讀取:

"E:\\Development\\Toolchains\\android-ndk-r9c\\ndk-build.cmd" NDK_DEBUG=1 V=1 all 
del /f/q .\libs\armeabi-v7a\libRAGEAndroid.so >NUL 2>NUL 
del /f/q .\libs\armeabi-v7a\gdbserver >NUL 2>NUL 
del /f/q .\libs\armeabi-v7a\gdb.setup >NUL 2>NUL 
[armeabi-v7a] Gdbserver  : [arm-linux-androideabi-4.8] libs/armeabi-v7a/gdbserver 
copy /b/y "E:\Development\Toolchains\android-ndk-r9c\prebuilt\android-arm\gdbserver\gdbserver" ".\libs\armeabi-v7a\gdbserver" > NUL 
[armeabi-v7a] Gdbsetup  : libs/armeabi-v7a/gdb.setup 
E:/Development/Toolchains/android-ndk-r9c/prebuilt/windows-x86_64/bin/echo.exe "set solib-search-path ./obj/local/armeabi-v7a" > ./libs/armeabi-v7a/gdb.setup 
E:/Development/Toolchains/android-ndk-r9c/prebuilt/windows-x86_64/bin/echo.exe "directory E:/Development/Toolchains/android-ndk-r9c/platforms/android-18/arch-arm/usr/include E:/Development/Toolchains/android-ndk-r9c/sources/android/native_app_glue E:/Development/Toolchains/android-ndk-r9c/sources/cxx-stl/gnu-libstdc++/4.8/include E:/Development/Toolchains/android-ndk-r9c/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include E:/Development/Toolchains/android-ndk-r9c/sources/cxx-stl/gnu-libstdc++/4.8/include/backward jni" >> ./libs/armeabi-v7a/gdb.setup 
[armeabi-v7a] Compile++ thumb: RAGEAndroid <= main.cpp 
E:/Development/Toolchains/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ -MMD -MP -MF ./obj/local/armeabi-v7a/objs-debug/RAGEAndroid/__/__/source/android/main.o.d -fpic -ffunction-sections -funwind-tables -fstack-protector -no-canonical-prefixes -march=armv7-a -mfloat-abi=softfp -mfpu=vfpv3-d16 -fno-exceptions -fno-rtti -mthumb -Os -g -DNDEBUG -fomit-frame-pointer -fno-strict-aliasing -finline-limit=64 -O0 -UNDEBUG -marm -fno-omit-frame-pointer -IE:/Development/Toolchains/android-ndk-r9c/sources/android/native_app_glue -IE:/Development/Toolchains/android-ndk-r9c/sources/cxx-stl/gnu-libstdc++/4.8/include -IE:/Development/Toolchains/android-ndk-r9c/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/include -IE:/Development/Toolchains/android-ndk-r9c/sources/cxx-stl/gnu-libstdc++/4.8/include/backward -Ijni -DANDROID -Wa,--noexecstack -Wformat -Werror=format-security -std=c++11 -pthread -DRAGE_ANDROID -DRAGE_DEBUG  -IE:/Development/Toolchains/android-ndk-r9c/platforms/android-18/arch-arm/usr/include -c jni/../../source/android/main.cpp -o ./obj/local/armeabi-v7a/objs-debug/RAGEAndroid/__/__/source/android/main.o 
[armeabi-v7a] SharedLibrary : libRAGEAndroid.so 
E:/Development/Toolchains/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-g++ -Wl,-soname,libRAGEAndroid.so -shared --sysroot=E:/Development/Toolchains/android-ndk-r9c/platforms/android-18/arch-arm ./obj/local/armeabi-v7a/objs-debug/RAGEAndroid/__/__/source/aabb.o #OMITTED OTHER .O FILES# -Wl,--fix-cortex-a8 -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -LE:/Development/Toolchains/android-ndk-r9c/platforms/android-18/arch-arm/usr/lib -llog -landroid -lm -lEGL -lGLESv3 -llog -lc -lm -o ./obj/local/armeabi-v7a/libRAGEAndroid.so 
[armeabi-v7a] Install  : libRAGEAndroid.so => libs/armeabi-v7a/libRAGEAndroid.so 
copy /b/y ".\obj\local\armeabi-v7a\libRAGEAndroid.so" ".\libs\armeabi-v7a\libRAGEAndroid.so" > NUL 
E:/Development/Toolchains/android-ndk-r9c/toolchains/arm-linux-androideabi-4.8/prebuilt/windows-x86_64/bin/arm-linux-androideabi-strip --strip-unneeded ./libs/armeabi-v7a/libRAGEAndroid.so 

如可以看到的文件被編譯與-g標誌和後來-O0設定權之前-UNDEBUG -marm -fno-省略幀指針。另請注意,在最後一行執行了arm-linux-androideabi-strip -strip-unneeded

在調試模式中調用的主要功能本機代碼的第一行睡覺,以確保我們有足夠的時間讓GDB連接:

sleep(5); 

我在我的項目上右鍵單擊,然後選擇「調試方式 - >本機Android應用程序」,和GDB輸出以下:

warning: Could not load shared library symbols for 98 libraries, e.g. /system/bin/linker. 
Use the "info sharedlibrary" command to see the complete listing. 
Do you need "set solib-search-path" or "set sysroot"? 
warning: Unable to find dynamic linker breakpoint function. 
GDB will retry eventurally. Meanwhile, it is likely 
that GDB is unable to debug shared library initializers 
or resolve pending breakpoints after dlopen(). 
[New Thread 19838] 
[New Thread 19840] 
[New Thread 19841] 
[New Thread 19842] 
[New Thread 19843] 
[New Thread 19844] 
[New Thread 19845] 
[New Thread 19846] 
[New Thread 19847] 
[New Thread 19850] 
No symbol table is loaded. Use the "file" command. 

過了一會如果我暫停執行和類型信息sharedlibrary這是輸出:

info sharedlibrary 
warning: Could not load shared library symbols for 5 libraries, e.g. eglsubAndroid.so. 
Use the "info sharedlibrary" command to see the complete listing. 
Do you need "set solib-search-path" or "set sysroot"? 
From  To   Syms Read Shared Object Library 
        No   /system/bin/linker 
        No   libc.so 
        No   libstdc++.so 
        No   libm.so 
        No   liblog.so 
        No   libcutils.so 
        No   libgccdemangle.so 
        No   libcorkscrew.so 
        No   libutils.so 
        No   libbinder.so 
        No   libhardware.so 
        No   libmemtrack.so 
        No   libz.so 
        No   libandroidfw.so 
        No   libexpat.so 
        No   libstlport.so 
        No   libnativehelper.so 
        No   libnetutils.so 
        No   libsync.so 
        No   libui.so 
        No   libGLES_trace.so 
        No   libEGL.so 
        No   libGLESv2.so 
        No   libgui.so 
        No   libinput.so 
        No   libcamera_metadata.so 
        No   libcamera_client.so 
        No   libpng.so 
        No   libft2.so 
        No   libjpeg.so 
        No   libgabi++.so 
        No   libicuuc.so 
        No   libicui18n.so 
        No   libskia.so 
        No   libsqlite.so 
        No   libGLESv1_CM.so 
        No   libETC1.so 
        No   libwpa_client.so 
        No   libhardware_legacy.so 
        No   libselinux.so 
        No   libsonivox.so 
        No   libcrypto.so 
        No   libssl.so 
        No   libstagefright_foundation.so 
        No   libspeexresampler.so 
        No   libaudioutils.so 
        No   libmedia.so 
        No   libusbhost.so 
        No   libharfbuzz_ng.so 
        No   libLLVM.so 
        No   libbcinfo.so 
        No   libbcc.so 
        No   libRS.so 
        No   libRScpp.so 
        No   libhwui.so 
        No   libandroid_runtime.so 
        No   libdvm.so 
        No   libjavacore.so 
        No   memtrack.msm8974.so 
        No   libdrmframework.so 
        No   libdrmframework_jni.so 
        No   libconnectivitymanager.so 
        No   libstagefright_omx.so 
        No   libstagefright_yuv.so 
        No   libvorbisidec.so 
        No   libpowermanager.so 
        No   libstagefright_enc_common.so 
        No   libstagefright_avc_common.so 
        No   libstagefright.so 
        No   libmtp.so 
        No   libexif.so 
        No   libstagefright_amrnb_common.so 
        No   libmedia_jni.so 
        No   libexif_jni.so 
        No   libcommon_time_client.so 
        No   libnbaio.so 
        No   libeffects.so 
        No   libaudioflinger.so 
        No   libvideoeditor_osal.so 
        No   libvideoeditor_videofilters.so 
        No   libvideoeditorplayer.so 
        No   libvideoeditor_core.so 
        No   libvideoeditor_jni.so 
        No   librs_jni.so 
        No   libandroid.so 
        No   libwilhelm.so 
        No   libOpenSLES.so 
        No   libjnigraphics.so 
        No   libwebviewchromium.so 
        No   libwebviewchromium_plat_support.so 
        No   libjavacrypto.so 
        No   libgsl.so 
        No   libadreno_utils.so 
        No   libEGL_adreno.so 
        No   libGLESv1_CM_adreno.so 
        No   libGLESv2_adreno.so 
        No   libGLESv3.so 
        No   libRAGEAndroid.so 
        No   eglsubAndroid.so 
        No   libsc-a3xx.so 
        No   libqdutils.so 
        No   libmemalloc.so 
        No   gralloc.msm8974.so 

如果我使用的libRAGEAndroid.so庫(我的庫)文件的命令,這是我得到什麼(省略完整路徑):

file "#OMITTED PROJECT PATH#/libs/armeabi-v7a/libRAGEAndroid.so" 

A program is being debugged already. 
Are you sure you want to change the file? (y or n) [answered Y; input not from terminal] 
Reading symbols from E:/Cloud/Dropbox/Development/Projects/PC/RAGE (Rajveer Aujla Game Engine)/0.0.21/RAGE/android/libs/armeabi-v7a/libRAGEAndroid.so...done. 

WARNING: no debugging symbols found in E:/Cloud/Dropbox/Development/Projects/PC/RAGE (Rajveer Aujla Game Engine)/0.0.21/RAGE/android/libs/armeabi-v7a/libRAGEAndroid.so. 
Either the binary was compiled without debugging information 
or the debugging information was removed (e.g., with strip or strip -g). 
Debugger capabilities will be very limited. 
For further information: http://wiki/Main/GdbFaq#No_debugging_symbols_found 

如果我再與預更換從OBJ /本地/ armeabi-V7A剝離文件,然後再次執行相同文件的命令,我得到:

file "E:/Cloud/Dropbox/Development/Projects/PC/RAGE (Rajveer Aujla Game Engine)/0.0.21/RAGE/android/libs/armeabi-v7a/libRAGEAndroid.so" 
A program is being debugged already. 
Are you sure you want to change the file? (y or n) [answered Y; input not from terminal] 
Reading symbols from E:/Cloud/Dropbox/Development/Projects/PC/RAGE (Rajveer Aujla Game Engine)/0.0.21/RAGE/android/libs/armeabi-v7a/libRAGEAndroid.so...done. 
Error in re-setting breakpoint 1: Cannot access memory at address 0x14ae08 

我有種迷失在何處何去何從,所以希望更有經驗的人能幫幫我!

+0

你現在可以用eclipse IDE進行調試嗎?幾年前我和ndk一起工作過,我不得不在終端中手動使用ndk-gdb命令來調試本機應用程序。 你也可以試試。 – StarDust

+0

我這麼認爲,如果我設置了NDK_DEBUG = 0並且使用「APP_OPTIM = debug」設置了相同的開關(-g和-O0),但是我沒有得到與GDB相關的東西(沒有gdb.setup或gdbserver文件在「 libs/armeabi-v7a「,當我右鍵單擊並選擇」Debug As - > Native Android Application「)時,GDB不會以應用程序啓動。不知道這是否意味着什麼。 – Rajveer

+0

(抱歉,我的意思是「APP_OPTIM:= debug」) – Rajveer

回答

0

什麼NDK插件做場景的生成GDB腳本和批處理腳本(在Windows上),從設備需要拉的二進制文件和gdbserver的推右版本的設備落後。

無論出於何種原因,如果你沒有得到一個件事吧,那些動人的部分之一將失敗,並會繼續徒勞無益。 我不會像AOSP本機調試那樣經常進行NDK調試。當我這樣做時,我會使用普通的vanilla eclipse調試配置來調試遠程C/C++應用程序並手動配置gdb和gdb腳本。你完全掌握了一切。

請檢查Debugging native code of Android Java apps文章。您可能需要查看生成的ndk-gdb腳本,以查看該插件使用的NDK工具文件夾中的哪個gdb/gdbserver組合。您可以將它們複製到一個單獨的文件夾並在eclipse配置中使用它們。您將不得不創建一個虛擬c/C++項目,指向您的源並在遠程調試配置中使用它。你需要牢記的是,這個項目用於調試,而不是構建源代碼。你應該使用你的NDK項目來構建代碼。