调试不适用于 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 北极狐

Android Studio 项目适用于 Lollipop,但不适用于 Kitkat

调试不适用于特定的 android 设备

Android Studio 0.5.0 重建不适用于 Proguard

Kapt 不适用于 Android Studio 3.0 中的 AutoValue

FloatingActionButton 示例适用于 Android Studio,但不适用于 Eclipse