在 Android 中进行 NDK(C/C++ 层)代码的断点调试,可以使用 Android Studio 配合调试器(如 LLDB)来实现
前提条件
- 项目使用的是 Android Studio(建议版本 4.0+,越新越好)
- NDK 配置正确(推荐使用较新版本,例如 r20)
externalNativeBuild
已配置(使用ndkBuild
或CMake
)- 使用的是 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 下一步