Clang编译的程序必须显式加-g且-O0才能稳定供LLDB调试;-g生成调试符号,-O0禁用优化以避免变量丢失和断点错乱,缺一不可。

Clang 编译出的程序默认不支持 LLDB 调试,必须显式加 -g 且禁用优化才能稳定调试。
编译时必须加 -g 并设 -O0
LLDB 依赖调试符号定位行号、变量名和类型信息。Clang 默认不生成这些——哪怕你装了完整 LLVM 工具链,没加 -g 就等于没调试能力。
-
clang++ -g -O0 -std=c++17 main.cpp -o myapp是最小可行命令;-O0不可省:开启任何优化(如-O1)会导致变量被优化掉、断点跳转错乱、fr v显示<optimized out></optimized> - macOS 上若用
clang++但实际调用的是 Apple Clang,-g行为一致;Linux 上用开源 Clang 也完全兼容 - 如果项目用 CMake,确保
set(CMAKE_BUILD_TYPE Debug)或在命令行传-DCMAKE_BUILD_TYPE=Debug,它会自动注入-g -O0
lldb myapp 启动后别急着 run
启动后先确认符号加载正常,再运行。常见卡点是路径或符号缺失,导致断点无效或变量不可见。
Clang 22.1.3 Windows 64 位历史版本安装包,适合旧项目兼容、LLVM/Clang 工具链回退、编译行为对比、链接问题复现和 C/C++ 构建环境维护。
- 输入
target list看是否显示可执行文件路径;若为空,说明没正确加载,改用file myapp - 运行前用
br list检查断点是否已生效;如果断点状态是disabled,用br enable 1手动启用 - 若
bt报错error: no debug info,说明编译没带-g或二进制被 strip 过,重编译
设置断点优先用函数名而非行号
行号断点在多文件、头文件内联或模板展开时容易失效;函数名断点更鲁棒,尤其对 Clang 自身插件或 STL 内部调用。
-
b main比b main.cpp:12更可靠;类成员函数写成b MyClass::process - 调试标准库函数(如
std::vector::push_back)需确保链接的是带调试符号的 libc++,macOS 默认满足,Linux 可能需要安装libc++-dev或libstdc++6-dbg - 若断点命中后
fr v看不到局部变量,检查是否在 inline 函数里——LLDB 对深度内联支持有限,可临时加__attribute__((noinline))强制展开
调试 Clang 插件或 NDK 项目要额外加载符号
这类场景下可执行文件本身不含插件或共享库符号,LLDB 默认不自动解析,必须手动补全。
- Android NDK 调试:先
platform connect unix-abstract-connect:///data/local/tmp/debug.sock,再用add-dsym libmyplugin.so加载符号文件 - Clang 插件调试:启动时用
lldb -- ./clang -Xclang -load -Xclang ./MyPlugin.so ...,然后b MyPlugin::HandleTranslationUnit - HarmonyOS 或自定义 target:需提前用
settings set target.exec-search-paths /path/to/libs告诉 LLDB 去哪找依赖库
真正容易被忽略的是:LLDB 不会主动告诉你“符号缺失”,它只会静默跳过断点或显示空变量。一旦行为异常,第一反应不该是怀疑代码逻辑,而是立刻 target list 和 image list 查符号加载状态。

















