c++ 如何为Android原生应用生成调试符号?

uurity8g  于 2023-04-01  发布在  Android
关注(0)|答案(4)|浏览(237)

我做的第一步开发原生Android和需要一些帮助。我复制armv7 gdbserver到我的手机和编译“hello word”测试应用程序编写的C++。现在我想调试我的应用程序与gdb从android ndk包。
我启动gdb并通过target remote命令连接到手机,并获得此消息,并在“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)

最好的问候保罗。

fzsnzjdm

fzsnzjdm1#

对于那些使用新NDK工具链(不使用Android.mk,但在build.gradle中添加externalNativeBuild等部分)的人,以下是步骤:
步骤1:按如下方式更改build.gradle

**注意:**如果您的ndk在库中使用,请更改 library 的gradle文件,而不是 main application 的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的文件。
如果你使用的是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

laik7k3q

laik7k3q2#

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

rekjcdws

rekjcdws3#

如果你的编译器是gcc或者clang,那么在编译的时候只要传递-g选项就可以生成调试符号。

lp0sw83n

lp0sw83n4#

我能够通过以下行向ndk-build实用程序添加调试符号:

LOCAL_CFLAGS := -g
LOCAL_STRIP_MODE := none
LOCAL_STRIP_MODULE := keep_symbols

我可以使用objdump -Wi和gdb来确认这些符号是否存在。也许用CMake在这些变量上使用set()会在该构建系统下有所帮助。
参考:NOT strip debug symbols ndk-build

相关问题