LLDB 可替代 GDB 调试 Clang 编译的 C++ 程序,但需注意调试信息生成(-g -gdwarf-5 -O0)、断点设置(b 需全签名加引号)、变量查看(fr v -T 或 expr --)、STL 格式化脚本加载、线程信号配置及 DWARF 版本兼容性。

LLDB 可以完全替代 GDB 调试 Clang 编译的 C++ 程序,但命令语法、表达式求值规则和某些调试行为有明显差异,直接套用 GDB 习惯容易卡在断点不触发、变量显示为空、print 报错等地方。
启动调试时必须用 clang++ -g 生成 DWARF 调试信息
Clang 默认不生成完整调试信息,仅 -g 不够稳定;推荐显式指定 DWARF 版本并禁用优化:
clang++ -g -gdwarf-5 -O0 -std=c++17 main.cpp -o main- 避免用
-gline-tables-only(LLDB 无法解析局部变量) - 如果链接了第三方静态库,确保它们也带
-g,否则进入函数后frame info显示???
breakpoint set 和 b 的行为与 GDB 不同
LLDB 的 breakpoint set 默认按源码行号或符号名模糊匹配,不像 GDB 那样严格区分 break func 和 break file:line。常见陷阱:
-
b main可能命中main符号(C entry)、main(int, char**)(C++ overload)甚至模板实例化后的main—— 用breakpoint list确认实际地址 - 在模板函数中设断点,需写全签名:
b "std::vector,引号不能省::push_back(const int&)" - 断点未命中?检查是否启用了
target.source-map:若源码路径与编译时不同,需运行settings set target.source-map /old/path /new/path
变量查看必须用 expr 或 fr v,print 是别名但不支持 STL 容器格式化
GDB 的 print vec[0] 在 LLDB 中会报 no member named 'operator[]',因为 LLDB 默认不加载 libc++ 的数据格式化脚本:
立即学习“C++免费学习笔记(深入)”;
- 启用 STL 支持:
command source /usr/lib/llvm-xx/share/lldb/data-formatters/cplusplus.py(路径依 LLVM 版本而异) - 查看变量优先用:
fr v -T my_vector(-T展开类型)或expr -- my_vector[0] -
expr中调用方法需加--分隔符:expr -- my_string.c_str(),否则解析失败 - 若
expr报Couldn't materialize: couldn't get the value of variable,说明变量被优化掉(即使有-O0,Clang 有时仍内联),加volatile临时标记或重编译
线程和异步信号调试需手动启用 target.process.thread.step-avoid-regexp
Clang 编译的程序常依赖 libc++ 的内部锁或 std::thread 启动逻辑,单步时容易跳进 __pthread_mutex_lock 等系统函数:
- 避免误入系统代码:
settings set target.process.thread.step-avoid-regexp "^(pthread|__libc|std::__).*" - 查看所有线程:
thread list,切换线程:thread select 2 - 处理 SIGSTOP/SIGUSR1 等信号:
process handle -s false -n false SIGUSR1(不暂停、不传递给程序)
最易被忽略的是调试信息版本与 LLDB 版本的兼容性——比如用 Clang 16 生成 -gdwarf-5,但系统自带 LLDB 14 可能无法解析模板参数,此时必须用匹配的 LLVM 工具链,不能只换调试器。











