首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android和GDB调试

Android和GDB调试
EN

Stack Overflow用户
提问于 2014-02-27 20:25:08
回答 1查看 3.7K关注 0票数 1

我在用GDB (在Windows上)调试我的本机应用程序时遇到了问题,请原谅这篇文章的长度。我正在使用一个标准设置(带有ADT、ndk-build的Eclipse)。我的构建命令是:

代码语言:javascript
复制
ndk-build NDK_DEBUG=1 V=1

下面是我的Android.mk和Application.mk文件:

Android.mk:

代码语言:javascript
复制
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

代码语言:javascript
复制
APP_STL                 := gnustl_static
NDK_TOOLCHAIN_VERSION   := 4.8
APP_ABI                 := armeabi-v7a
APP_PLATFORM            := android-18

详细模式在生成过程中输出以下内容(目前只显示单个文件的构建,请注意,我只显示了一个.o文件被链接,而省略了其余的文件,以便于读取标记#省略其他.O FILES#):

代码语言:javascript
复制
"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连接:

代码语言:javascript
复制
sleep(5);

我右键单击我的项目并选择"Debug As ->本地安卓应用程序“,GDB输出以下内容:

代码语言:javascript
复制
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.

一段时间后,如果我暂停执行并输入信息共享库,这是输出:

代码语言:javascript
复制
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命令,这就是我得到的(省略了完整的路径):

代码语言:javascript
复制
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中的预剥离文件,然后再次执行相同的文件命令,则得到:

代码语言:javascript
复制
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

我有点不知所措,所以希望有更多经验的人能帮我解决问题!

EN

回答 1

Stack Overflow用户

发布于 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项目用于构建代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22079562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档