我在使用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