2014-02-27 114 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项目来构建代码。