我在用GDB (在Windows上)调试我的本机应用程序时遇到了问题,请原谅这篇文章的长度。我正在使用一个标准设置(带有ADT、ndk-build的Eclipse)。我的构建命令是:
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详细模式在生成过程中输出以下内容(目前只显示单个文件的构建,请注意,我只显示了一个.o文件被链接,而省略了其余的文件,以便于读取标记#省略其他.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条形带-不需要的。
在调试模式中,主函数中调用的第一行本机代码将休眠,以确保我们有足够的时间让GDB连接:
sleep(5);我右键单击我的项目并选择"Debug As ->本地安卓应用程序“,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.一段时间后,如果我暂停执行并输入信息共享库,这是输出:
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命令,这就是我得到的(省略了完整的路径):
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/local/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我有点不知所措,所以希望有更多经验的人能帮我解决问题!
发布于 2014-07-14 17:45:39
ndk插件在幕后所做的是生成gdb脚本和一个批处理脚本(在windows上),以从设备中提取所需的二进制文件,并将正确版本的gdbserver推到设备上。
无论出于什么原因,如果你不正确的一件事,其中一个移动的部分将失败,你将继续鹅肝酱。我不像AOSP本机调试那样经常进行NDK调试。当我这样做时,我使用普通的eclipse调试配置来调试远程C/C++应用程序,并手动配置gdb和gdb脚本。你可以完全控制一切。
请查看调试Android Java应用程序的本机代码的文章。您可能需要查看生成的NDK脚本,以查看插件从NDK文件夹中使用的gdb/gdbserver组合。您可以将它们复制到单独的文件夹中,并在eclipse配置中使用它们。您必须创建一个指向源的虚拟c/c++项目,并在远程调试配置中使用该项目。您需要记住的是,这个项目是为了调试,而不是为了构建源代码。您应该将NDK项目用于构建代码。
https://stackoverflow.com/questions/22079562
复制相似问题