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

Posted

技术标签:

【中文标题】Android:在 android studio 中进行 NDK-Build C/C++ 调试【英文标题】:Android: NDK-Build C/C++ debug in android studio 【发布时间】:2021-05-10 03:32:12 【问题描述】:

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

    jni , C/C++ 源文件 Dirs.实际的 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 文件失败并出现以下错误。

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

谢谢

【问题讨论】:

你能告诉我们你在哪一行设置断点吗? 有真正的代码被执行。添加了一个示例。 这确实是一个奇怪的问题。我唯一能想到的是编译器可能正在优化代码并摆脱那条线。那或调试符号不存在,因此调试器无法跟踪它当前正在执行的行。 感谢您的建议。我检查了许多文件,没有一个是可调试的。在 jni 文件夹之外放置 C 文件重要吗?尝试更新 gradle 并生成完整的调试符号。 【参考方案1】:

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

来自NDK Bug Tracker:

选择运行 -> 编辑配置

在左侧,选择Android App -> app

在右侧,选择调试器选项卡

在符号目录子选项卡下,按 + 按钮

浏览到以下路径:

libModule/build/intermediates/cmake/debug/obj 在 Build Variants 窗口中,选择应用的“调试”配置

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

【讨论】:

【参考方案2】:

    你以前用过 Proguard 吗?检查这些SO answers,特别是关于将行添加到proguard-rules.pro的那一项

    还要检查您是否将调试类型设置为 Java Only。为此,请转到顶部栏,在“应用”选择器中转到编辑配置。选择“应用程序”,然后转到调试器。

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

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

    最后但并非最不重要。您是否尝试过使缓存无效/重新启动?转到文件-> 使缓存无效/重新启动。这将清除可能会弄乱调试器的缓存。

【讨论】:

【参考方案3】:

其他答案很有用。

但对我来说真正的问题在于我的 android.mk 文件中包含 LOCAL_LDFLAGS --strip-all ,它没有生成用于调试的符号。一旦它被删除,调试就可以工作了。

NDK 团队 cmets: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.

【讨论】:

以上是关于Android:在 android studio 中进行 NDK-Build C/C++ 调试的主要内容,如果未能解决你的问题,请参考以下文章

android-gif-drawable在android studio上怎么配置

android studio source在哪儿

android studio preview在哪 在 View -> Tool Windows 没有 Preview

如何在mac上安装android studio

android studio怎么查看ddms

如何手动升级android studio?