【问题标题】:How to generate debug symbols for android native app?如何为 android 本机应用程序生成调试符号?
【发布时间】:2017-01-23 17:56:07
【问题描述】:

我在为 Native Android 开发过程中迈出了第一步,需要一些帮助。我将 armv7 gdbserver 复制到我的手机并编译用 C++ 编写的“hello word”测试应用程序。现在我想用 android ndk 包中的 gdb 调试我的应用程序。

我启动 gdb 并通过目标远程命令连接到手机并获取此消息,并且在“s”命令后 gdb 保持。

(gdb) target remote 192.168.1.157:1235
Remote debugging using 192.168.1.157:1235
Reading /data/local/Test from remote target...
warning: File transfers from remote targets can be slow. Use "set  sysroot" to access files locally instead.
Reading /data/local/Test from remote target...
Reading symbols from target:/data/local/Test...done.
Reading /system/bin/linker from remote target...
Reading /system/bin/linker from remote target...
Reading symbols from target:/system/bin/linker...(no debugging symbols found)...done.
0xb6fdf654 in __dl__start () from target:/system/bin/linker
(gdb) s
Single stepping until exit from function __dl__start,
which has no line number information.

我做错了什么?为什么它成立?以及如何生成符号/调试信息?我尝试设置“set(CMAKE_BUILD_TYPE Debug)”,但没有生成新文件。

我的 CmakeLists.Txt

set(PROJECT_NAME Test)

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_TOOLCHAIN_FILE android-cmake/android.toolchain.cmake)
set(ANDROID_NDK /home/drem1lin/Android/Sdk/ndk-bundle)


set(ANDROID_NATIVE_API_LEVEL "android-19")
set(ANDROID_TOOLCHAIN_NAME "arm-linux-androideabi-4.9")
set(ANDROID_ABI "armeabi-v7a")

project(${PROJECT_NAME}) 
cmake_minimum_required(VERSION 3.1)

include_directories(include)
file(GLOB SOURCES source/*.c*)
add_executable(${PROJECT_NAME} ${SOURCES})
foreach (module_src ${MODULES})
    get_filename_component(module ${module_src} NAME_WE)
    string(TOLOWER ${module} module)
    add_library(${module} SHARED ${module_src})
    set_target_properties(${module} PROPERTIES PREFIX "")
    set_target_properties(${module} PROPERTIES SUFFIX ".m")
    target_link_libraries(${module} ${LIBRARY_DEPS})
endforeach(module_src)

向保罗致以最诚挚的问候。

【问题讨论】:

    标签: android c++ android-ndk


    【解决方案1】:

    对于那些使用新的 NDK 工具链(不使用Android.mk,但在build.gradle 中添加类似externalNativeBuild 的部分)的用户,步骤如下:

    Step1:修改build.gradle如下。

    注意:如果您的 ndk 用于库中,请更改 的 gradle 文件,而不是 主应用程序 的.

    android {
      defaultConfig {
        packagingOptions {
          doNotStrip '**.so'     // ADD THIS! #1
        }
        externalNativeBuild {
          cmake {
            cppFlags "-Wl,--build-id -g"     // ADD THIS! #2
          }
        }
      }
    }
    

    第 2 步:构建项目(对我来说是 flutter build apk --debug,但对于原生 Android 项目,你知道它)。

    第 3 步:现在您的带符号的 .so 在这里:(这是 sample 位置,其中库名为 vision_utils,我的 .so 文件名为 libvision_utils.so)

    ./build/vision_utils/intermediates/cmake/debug/obj/arm64-v8a/libvision_utils.so
    

    ./build/vision_utils/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libvision_utils.so
    

    Bonus1:如果您想要 apk 中的“实际”.so 文件,请找到 unzip -p ./build/app/outputs/apk/debug/app-debug.apk lib/arm64-v8a/libvision_utils.so > ./build/temp-libvision_utils.so

    Bonus2:如果你使用bloaty,你可以像这样运行你的命令:bloaty ./build/temp-libvision_utils.so --debug-file=./build/vision_utils/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libvision_utils.so -d compileunits

    【讨论】:

      【解决方案2】:

      我有这个麻烦,因为我知道 linux 构建系统非常糟糕。在{project}/obj/local/armeabi/ 文件夹中创建带有符号的可执行文件

      【讨论】:

        【解决方案3】:

        如果您的编译器是 gcc 或 clang,则只需在编译时传递 -g 选项即可生成调试符号。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-17
          • 1970-01-01
          • 2020-06-06
          • 2016-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-14
          相关资源
          最近更新 更多