繁体   English   中英

在 Android Studio 中调试动态加载的本机库?

[英]Debug a dynamically loaded native library in Android Studio?

我有一个看起来像这样的项目:

- project
    - app
       - src.../cpp/
       - src.../java/
    - other modules...

cpp 代码是在 build.gradle 中使用 cmake 构建的:

externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}

buildTypes {
   ...
    debug {
        debuggable true
        jniDebuggable true
        externalNativeBuild {
            cmake {
                arguments "-DCMAKE_BUILD_TYPE=Debug"
                abiFilters "armeabi-v7a", "armeabi", "x86"
            }
        }
    }
}

productFlavors {
    ...
    experimental {
        externalNativeBuild {
            cmake {
                targets "sqlite_gcd_func"
            }
        }
    }
}

CMakeLists.txt 在哪里:

cmake_minimum_required(VERSION 3.6)

add_library( # Specifies the name of the library.
         sqlite_gcd_func
         # Sets the library as a shared library.
         MODULE
         # Provides a relative path to your source file(s).
         src/Experimental/cpp/GreatCircleDistance.cpp )
# Specifies a path to native header files.
include_directories(src/Experimental/cpp/include/)

生成的 .so 库通过 SQL 作为扩展加载到 SQLite 中:

Select load_extension('libsqlite_gcd_func', null)

之后库中定义的函数可用于 SQL 查询。

这一切都有效。

调试什么不行; CPP 代码中设置的断点不会触发。

我认为这是因为代码是在运行时动态加载的; 我还尝试通过以下方式使用 java 直接加载模块:

java.lang.System.loadLibrary("sqlite_gcd_func");

但是断点仍然不起作用。

我对 lldb 的了解很少; 我假设我需要告诉它加载的模块(通过 lldb 中的“图像列表”可见)是一个已知模块,但不知道如何这样做(如果这甚至是问题的话)。

在告诉 gradle/lldb/Android Studio 如何调试此代码方面的任何帮助将不胜感激!

编辑:

我用类似的设置创建了一个更简单的项目,它是可调试的。 在不可调试的情况下,当我进入 lldb 并运行“图像列表”时,有问题的 .so 显示为:

C:\Users\ME\.lldb\module_cache\remote-android\.cache\8D1C60AA-E947-56CA-CBA5-0AA7A46B955E-73E37532\libname.so

(即看起来像是从 AVD 复制的版本)。

而在我可以调试的那个中,它显示在:

C:\...\project\app\build\intermediates\cmake\debug\obj\x86\libname.so

IE。 构建区域中的实际库。

lldb 似乎出于某种原因不使用本地应用程序版本。

知道什么会导致这种情况吗?

事实证明这是由于AS中的旧错误。 显然在过去,IML文件中“native-android-gradle”部分中的“SELECTED_BUILD_VARIANT”可能与实际选择的风格不一致。 这导致无法加载.so文件。

一旦纠正,这个值现在似乎仍然是最新的,以下是对(现在修复的)bug的讨论的链接:

https://issuetracker.google.com/issues/37114841

从我所知,项目同步可以解决问题(它不适合我)。

我有一个类似的问题,我无法调试动态加载的本机库。 事实证明,Android构建系统在将其放入APK之前对我的库中的调试信息进行了条带化​​。 当我意识到我的300MB磁带库在APK中打包后缩小到30MB时,我就清楚了。

您可以使用Android Gradle Packaging Options禁用该行为。 build.gradle文件中添加类似的东西:

android {
    packagingOptions {
    // By default .so libraries are striped from debug information when creating APK
    // To prevent this make sure your .so files are matching that doNotStrip pattern
    // See Gradle pattern document for details:
    // https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/util/PatternFilterable.html
    doNotStrip "**"
    }
}

这与Android Studio 2.3.3相关。

缓存无效并重新启动。 为我工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM