如何为 android 本机应用程序生成调试符号?

新手上路,请多包涵

我在为 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)

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

原文由 drem1lin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 946
2 个回答

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

原文由 drem1lin 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

Step1:改变 build.gradle 如下。

注意: 如果您的 ndk 在库中使用,则更改您的 library 的 gradle 文件而不是您的 main application 的。

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

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

第3步:现在你的 .so 带符号在这里:(这是 示例 位置,其中库名为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

奖励 1:如果您想要 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

原文由 ch271828n 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题