移动端调试器入门 —— Cxxdroid 内置 gdb
为什么需要调试器
编译报错告诉你的是「代码写得不对」,但运行时错误(segmentation fault、内存泄漏、死循环、逻辑 bug)编译器管不了。调试器的作用是让程序停在你指定的位置,然后你可以:
- 看到当前所有变量的值
- 一行一行地执行代码
- 查看函数调用链
- 在出错点现场抓到 bug
Cxxdroid 调试器的定位
官方选择 gdb 是因为它:
- 跨平台:Android 上能跑,桌面也能跑,行为一致
- 成熟稳定:几十年历史,文档和社区支持充足
- 核心功能完备:断点、单步、变量、调用栈、Watch 窗口都有
但 Cxxdroid 的 gdb 有几个明显限制:
| 功能 | Cxxdroid 状态 | 桌面 IDE 状态 |
|---|---|---|
| 断点 | ✅ 支持行断点 | ✅ 行断点 + 条件断点 + 表达式断点 |
| 单步 | ✅ Step Over / Into / Out | ✅ 完整 |
| 变量查看 | ✅ 当前作用域变量 | ✅ 当前 + Watch 任意变量 |
| 调用栈 | ✅ 支持 | ✅ 支持 + 每个帧的变量 |
| 内存检查 | ❌ 无 | ✅ Valgrind / AddressSanitizer |
| 性能分析 | ❌ 无 | ✅ CPU/GPU 分析器 |
| 远程调试 | ❌ 无 | ✅ 跨设备远程 |
启动调试
与「编译运行」不同,调试模式需要:
- Debug 模式编译:在编译选项里开启
-g(生成调试符号),关闭-O2等优化(优化后的代码和源码对应关系模糊) - 启动调试会话:点击「调试」按钮(或菜单选「Debug」),应用会启动 gdb 子进程并加载你的可执行文件
调试界面
典型的界面布局:
- 左侧:源代码(行号 gutter 上点一下加断点)
- 底部:调试面板(变量值、调用栈)
- 控制栏:Step Over / Step Into / Step Out / Continue

调试的核心流程
- 在你想停下来的代码行设置断点
- 启动调试模式编译 + 运行
- 程序运行到断点处自动停下
- 查看当前变量值,分析状态
- 如果还没找到原因,单步执行一行,再停下看变量
- 重复 5 直到定位到 bug 根源
- 修复代码,重新编译调试
典型的调试场景
空指针解引用(Segfault)程序崩溃了,开启调试模式运行到崩溃点——调试器会在崩溃行自动停住,显示此时所有变量值,很容易找到是哪个指针为 null。
循环不退出程序看起来「卡死」了——开启调试,在循环体内设断点,观察循环条件变量每次迭代是否在正常变化。
逻辑错误程序能跑完但输出不对——在关键判断点设断点,看条件表达式两侧的变量值到底是什么。
与桌面调试的体验差异
桌面 CLion 的调试面板可以:
- 点开一个变量查看它的所有成员(包括嵌套的 STL 容器)
- 在表达式求值器里输入任意 C++ 表达式查看结果
- 条件断点(比如「i == 5 时才停下」)
Cxxdroid 调试器不支持这些高级功能,但核心的断点 + 单步 + 变量值查看足够应对大部分运行时错误。如果遇到极其复杂的调试需求,建议手机上写好草稿、换到桌面 IDE 上深度调试。