如何为Android原生应用程序生成调试符号?

时间:2017-01-23 17:56:07

标签: android c++ android-ndk

我为Native Android开发的第一步需要一些帮助。我将armv7 gdbserver复制到我的手机上并编译了#34;你好的话"用C ++编写的测试应用程序。现在我想用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.

我做错了什么?为何如此?以及如何生成符号/调试信息?我试着设置"设置(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)

最诚挚的问候保罗。

3 个答案:

答案 0 :(得分:1)

对于那些使用新的NDK工具链(不使用Sub ToggleVisibility(oSh as Shape) oSh.Visible = Not oSh.Visible End Sub 但在with recursive nodes as ( select serial_id, upline, left pos, 1 lvl from customers where upline = 0 union all select c.serial_id, c.upline, n.left + c.left, n.lvl + 1 from nodes n inner join customers c on c.upline = n.serial_id ) select * from nodes order by lvl desc, pos desc limit 1 中添加Android.mk之类的用户),请按以下步骤操作:

第1步:如下更改externalNativeBuild

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

build.gradle

第2步:构建项目(对我来说是build.gradle,但对于本机Android项目,您知道的。)

第3步:现在您的带有符号的android { defaultConfig { packagingOptions { doNotStrip '**.so' // ADD THIS! #1 } externalNativeBuild { cmake { cppFlags "-Wl,--build-id -g" // ADD THIS! #2 } } } } 在这里:(这是 sample 位置,其中库名是vision_utils,我的.so文件名是libvision_utils.so)

flutter build apk --debug

.so

Bonus1:如果您想要apk中的“实际” .so文件,请像./build/vision_utils/intermediates/cmake/debug/obj/arm64-v8a/libvision_utils.so 那样找到它。

Bonus2:如果您使用的是bloaty,则可以运行以下命令:./build/vision_utils/intermediates/stripped_native_libs/debug/out/lib/arm64-v8a/libvision_utils.so

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我有这个麻烦,因为我知道linux构建系统非常糟糕。在"EDIT"文件夹

中创建了符号可执行文件