【问题标题】:Debugging C++/native library modules not working with Android Studio (Cmake used)调试不适用于 Android Studio 的 C++/本机库模块(使用 Cmake)
【发布时间】: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   

【问题讨论】:

    标签: android android-studio debugging android-ndk cmake


    【解决方案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)
    

    将上述代码更改为仅在发布版本中应用后,调试器(包括断点)可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-05
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 2021-03-04
      相关资源
      最近更新 更多