调试不适用于 Android Studio 的 C++/本机库模块(使用 Cmake)
Posted
技术标签:
【中文标题】调试不适用于 Android Studio 的 C++/本机库模块(使用 Cmake)【英文标题】:Debugging C++/native library modules not working with Android Studio (Cmake used) 【发布时间】:2017-06-08 22:20:18 【问题描述】:我在调试库模块的 C++ 文件时遇到问题。
这一般可以吗?
如果应用程序项目包含 c++ 代码,则调试工作正常。 但我想将 C++ 代码移动到库模块中。
开始会话时的错误消息:
现在启动本机调试会话
注意!未找到符号目录 - 请检查您的本机调试配置
我的库的 gradle 文件:
apply plugin: 'com.android.library'
android
compileSdkVersion 24
buildToolsVersion "25.0.2"
defaultConfig
minSdkVersion 16
targetSdkVersion 21
versionCode 1
versionName "1.0"
externalNativeBuild
cmake
arguments "-DANDROID_PLATFORM_LEVEL=$11",
'-DANDROID_TOOLCHAIN=clang', '-DANDROID_STL=gnustl_static'
buildTypes
release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
externalNativeBuild
cmake
path "CMakeLists.txt"
dependencies
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-annotations:24.2.0'
在运行配置中调试器设置为自动
补充:
我正在使用:
分级:2.2.3
Android 工作室:2.2.3
在 LLLB 控制台中,我检查了断点列表:
断点列表-v
我所有的检查点都列在那里。
断点不工作
1: file = 'C:\android-dev\...\test.cpp', line = 19, exact_match = 0
..就是这样
工作断点
1: file = 'C:\android-dev\...\test.cpp', line = 19, exact_match = 0
1.1:
module = C:\android-dev\...\test.so
compile unit = gl_code.cpp
function = testFunc(..)
location = C:\android-dev\...\test.cpp:16
address = 0x0000007f871d068c
resolved = true
hit count = 1
【问题讨论】:
【参考方案1】:原因似乎是,创建了 lib 的发布版本, 不支持调试,即使应用程序是使用调试选项构建的。
解决方案:
要解决此问题,请执行以下解决方法。它确保构建了调试版本。
在您的应用中 build.gradle 更改:
compile project(':nativelib')
到
compile project(path: ':nativelib' , configuration: 'debug')
在 libs build.gradle 中添加:
android
publishNonDefault true //this line
compileSdkVersion 24
buildToolsVersion "25.0.2"
defaultConfig
...
...
更新:
查看谷歌问题以获取更新:
https://code.google.com/p/android/issues/detail?id=222276
【讨论】:
如果有人不想阅读上面链接的问题,它指出旧版本的 Gradle Android 插件用于打包发布库,即使应用程序设置为调试。但是,这个问题现在已经修复,因此选择调试应用程序也会选择调试库。这里的正式文档:developer.android.com/studio/build/dependencies#variant_aware【参考方案2】:我遇到了同样的错误(“注意!未找到符号目录 - 请检查您的本机调试配置。”)。我的解决方案是(Android Studio 3.2):
运行→编辑配置→“调试器”选项卡→将您的工作路径添加到符号目录。
【讨论】:
“符号目录的路径”是什么?特别是考虑到构建了多个本机库(x86、x86_64 等)? @GoZoner 老实说,我只是将它设置为“本机库”工作目录(或您的模块的目录),它似乎工作正常。请参阅:imgur.com/iyo6mzn。 在 Android Studio 3.3.1 中,我似乎没有收到任何关于找不到符号目录的错误。但是,在我按照@brkeyal 的指示添加符号目录之前,调试器不会在我的库中的本机 C++ 代码中的断点处停止。我添加的目录是“library/build/intermediates/cmake/debug/obj”,其中包含每个平台(x86、arm64-v8a 等)的文件夹。您还应该在 Build Variants 窗口中选择“调试”应用配置。 @GoZoner 我添加了以下符号目录,然后从那里正常工作 /Users/MYUSERNAME/Library/Android/sdk/build-tools/29.0.0/lib64 /Users/MYUSERNAME/Library/ Android/sdk/build-tools/29.0.0/lib【参考方案3】:几个月前我在自己的库中遇到了类似的问题,因为我认为如果我添加 -g (gcc) 标志,它会生成调试符号,就像桌面(linux、unix 内核)应用程序一样。
但是,实际上它并不能生成调试符号。
我看到您使用 Cmake 作为外部构建工具和 clang 编译器。
所以在我的情况下,我使用 gcc 配置了我的 cmake 脚本,但使用了 gradle 脚本,但我认为它会是一样的,我添加 -mapcs-frame CMAKE_CXX_FLAGS。
externalNativeBuild
cmake
arguments "-DANDROID_PLATFORM_LEVEL=$11",
'-DANDROID_TOOLCHAIN=gcc',
'-DANDROID_STL=gnustl_static',
'DCMAKE_CXX_FLAGS=-mapcs-frame'
我知道如果你使用 clang compile 可能这个标志不能工作。但我的想法是分享我在 android 原生调试方面的经验。
我希望这些线索可以帮助你。
干杯。 乌奈。
【讨论】:
感谢您的想法。我试图用 gcc 和你的论点来编译它。还是有同样的问题。 也许你已经完成了,你是在使用 gradle Experiment 来调试原生库吗?我通常使用 gradle 0.7.0 实验版 我使用 gradle 2.2.3。文档说,从 2.2.0 开始支持它【参考方案4】:在我的例子中,是因为同事改变了符号的可见性。
set(CMAKE_CXX_FLAGS -fvisibility=hidden)
将上述代码更改为仅在发布版本中应用后,调试器(包括断点)可以正常工作。
【讨论】:
以上是关于调试不适用于 Android Studio 的 C++/本机库模块(使用 Cmake)的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio 项目适用于 Lollipop,但不适用于 Kitkat
Android Studio 0.5.0 重建不适用于 Proguard