Android: NDK-Build C/C++ 在 android studio 中调试

Android: NDK-Build C/C++ debug in android studio

尝试在 Android studio(v4.1.2) 中调试 ndk-build C 代码。下面是 build.gradle 设置。

  1. jni , C/C++ 源文件目录。实际的 C 文件不在 jni 文件夹下,而是在它之外,但在 android.mk 文件中引用。

    sourceSets.main.jniLibs.srcDirs = ['D:/ccodefolder/jni/']

2)Android.mk 从 C、c++ 代码构建共享库,并链接内置的共享库和静态库。

 externalNativeBuild {
           ndkBuild {
               path file('D:/ccodefolder/jni/Android.mk')
           }
       }
       ndkVersion '21.1.6352462'
debug {
        debuggable true
        jniDebuggable true
        minifyEnabled false
        shrinkResources false
       //ndk.debugSymbolLevel = 'FULL'
    }

4)项目结构如图

能够 运行 项目和共享库与其他预构建的 .SO 和 apk 作品一起生成,还创建了 CPP 文件夹并能够看到我的项目的 C 代码文件。

调试问题:

LLDB 服务器启动并且调试器附加到进程,但是调试任何 C 文件都失败并出现以下错误。

当前不会命中断点。没有可执行代码与此行关联

谢谢

您可以尝试一些方法,每个解决方案我都取得了成功。

来自NDK Bug Tracker

Select Run -> Edit Configurations

On the left side, select Android App -> app

On the right side, select the Debugger tab

Under the Symbol Directories sub-tab, press the + button

Browse to the following path:

libModule/build/intermediates/cmake/debug/obj In the Build Variants window, select the "debug" configuration for the app

我发现有时可行的另一种解决方案是仅在 C++ 代码中添加断点。 Android Studio 调试器不能很好地处理从 Java/Kotlin 到 C++ 的转换。我发现通过删除所有 Java 断点、重新启动 Android Studio 并再次启动调试模式,现在将命中 C++ 断点(尽管现在添加的任何 Java 断点都将丢失) .

  1. 你用过Proguard吗?检查这些 ,特别是关于将行添加到 proguard-rules.pro

    的那个
  2. 还要检查您是否将调试类型设置为 Java Only。为此,转到顶部栏,在 'app' 选择器中转到编辑配置。 Select 'app' 然后转到调试器。

  3. 也可能是因为Instant 运行。 要禁用 Instant 运行,请转到文件 > 设置 > 构建、执行、部署 > Instant 运行 > 取消选中启用 Instant 运行

  4. 另一个问题可能是 Android Studio 处于离线模式。要禁用离线模式:文件 > 设置 (Ctrl-Alt-S) > 构建、执行、部署 > Gradle 在全局 gradle 设置下:离线工作复选框

  5. 最后但并非最不重要的一点。您是否尝试过 Invalidate Caches/Restart?转到文件 -> 无效 Caches/Restart。这将清除可能会扰乱调试器的缓存。

其他答案很有用。

但对我来说真正的问题是我的 android.mk 文件有 LOCAL_LDFLAGS --strip-all 没有生成用于调试的符号。一旦它被删除调试工作。

NDK 团队评论:https://issuetracker.google.com/issues/179634983

For the .so file(s) built by ndk-build:
Android Studio can automatically identify the location of the debugging symbol files.
Breakpoints should work without any additional effort.
For the .so file(s) that are included as prebuilt libraries using jniLibs.srcDirs:
Android Studio does not know where to find the debugging symbol files.
Breakpoints set on C++ files that were compiled into these .so libraries will show up as Breakpoint will not be hit. No executable code is associated with this line warnings, and won't hit.
You need to tell Android Studio where to find the symbol files for these .so files.
You can achieve this by adding the directory of your symbol files to Edit Configurations... | Debugger | Symbol Directories.