我在使用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
我有种迷失在何处何去何从,所以希望更有经验的人能帮帮我!
你现在可以用eclipse IDE进行调试吗?几年前我和ndk一起工作过,我不得不在终端中手动使用ndk-gdb命令来调试本机应用程序。 你也可以试试。 – StarDust
我这么认为,如果我设置了NDK_DEBUG = 0并且使用“APP_OPTIM = debug”设置了相同的开关(-g和-O0),但是我没有得到与GDB相关的东西(没有gdb.setup或gdbserver文件在“ libs/armeabi-v7a“,当我右键单击并选择”Debug As - > Native Android Application“)时,GDB不会以应用程序启动。不知道这是否意味着什么。 – Rajveer
(抱歉,我的意思是“APP_OPTIM:= debug”) – Rajveer