Android 如何 debug 断点调试 c++ 层

围巾🧣 2025年04月08日 70次浏览

在 Android 中进行 NDK(C/C++ 层)代码的断点调试,可以使用 Android Studio 配合调试器(如 LLDB)来实现


前提条件

  1. 项目使用的是 Android Studio(建议版本 4.0+,越新越好)
  2. NDK 配置正确(推荐使用较新版本,例如 r20)
  3. externalNativeBuild 已配置(使用 ndkBuildCMake
  4. 使用的是 Debug 构建(Build Variant = debug)

🔧 步骤详解

1. 开启 NDK 调试支持

  • build.gradle 中启用 debuggable true
android {
    buildTypes {
        debug {
            debuggable true
        }
    }
}

2. 确保生成符号表(.so 带调试信息)

  • Application.mk(ndk-build)中添加:
APP_OPTIM := debug
NDK_DEBUG := 1
  • 如果用 CMake,请确保使用 -g 编译:
set(CMAKE_BUILD_TYPE Debug)

3. 构建 Debug APK

  • Build → Build APK(s)
  • 或者 Build > Make Project
  • 运行

4. 设置断点

  • 打开你需要调试的 .c.cpp 文件
  • 点击行号设置断点(确保 Android Studio 识别 native 文件)

5. 运行 App 并连接调试器

  • 点击 Android Studio 顶部工具栏的 “Debug” 图标

  • 会自动附加到进程,并加载 LLDB

  • 看到如下输出即成功连接:

    lldb-server xxxx
    LLDB: Launching process...
    LLDB: Debugger attached to process <pid>
    

6. 调试原生层代码

  • 等执行到断点会自动中断
  • 可以查看变量值、栈帧、调用关系等

🛠 常见问题排查

问题 原因 解决方案
断点不生效 .so 没有符号信息 检查 APP_OPTIM := debug 是否设置
无法进入 native 层 未连接调试器或未触发 确保触发了 native 方法
无法加载符号 so 未被打包或优化 禁用 R8/Proguard 或设置 keep rules
无调试按钮 Android Studio 未识别 native 层 检查 C/C++ 插件是否启用、gradle 是否正确关联 native 代码

拓展:使用 LLDB 命令调试

在 “Debugger” 窗口 > LLDB Console,可使用:

  • bt(backtrace)
  • frame variable
  • expr(表达式)
  • thread step-in / step-out
  • next 、n 下一步