在 macOS 上用 LLDB 调试 C++ 程序需编译时加 -g 且禁用优化,启动 lldb ./main 后用 b main.cpp:15 设断点、r 运行、p x 查变量、bt 查栈帧,并配置 .lldbinit 支持 STL 友好显示。

在 macOS 上用 LLDB 调试 C++ 程序,不需要打开 Xcode 图形界面,只需命令行 + 正确编译选项即可高效定位问题。关键是让编译器生成调试信息、熟悉 LLDB 常用命令流,并理解符号加载机制。
编译时必须加 -g 且避免优化
LLDB 依赖调试符号(DWARF)定位变量、行号和调用栈。若编译时没加 -g,或用了 -O2/-O3,断点可能错位、变量显示为
- 正确示例:
clang++ -g -std=c++17 main.cpp -o main - 错误示例:
clang++ -O2 main.cpp -o main(无 -g,且开启优化) - 如用 CMake,确保
set(CMAKE_BUILD_TYPE Debug)或运行cmake -DCMAKE_BUILD_TYPE=Debug ..
启动 LLDB 并设置断点的典型流程
从加载可执行文件到命中第一处断点,几步就能跑起来:
- 启动调试器:
lldb ./main - 设源码断点:
breakpoint set --file main.cpp --line 15(简写b main.cpp:15) - 设函数断点:
b MyClass::doSomething(支持类名限定) - 运行:
run(或简写r),程序会在断点处暂停 - 查看当前栈帧:
frame info或bt(backtrace)看调用链
运行中查看和修改变量值
停在断点后,变量可见性取决于作用域和优化状态。常用操作包括:
立即学习“C++免费学习笔记(深入)”;
- 打印变量:
expr x或简写p x(支持 C++ 表达式,如p vec.size()) - 打印变量地址:
p &x - 修改变量值:
expr x = 42(对局部变量、成员变量均有效) - 查看寄存器:
register read rax(调试底层行为时有用) - 自动补全支持:输入
p myObj.后按 Tab,LLDB 会列出可用成员函数/字段
处理常见卡点:符号没加载、断点不命中、STL 容器乱码
这些问题大多源于构建配置或 LLDB 配置缺失:
-
“Module not found” 或 “No debug symbols”:确认二进制含 DWARF,执行
file ./main应显示 with debug_info;用lldb ./main -o "image list"查看模块是否已加载 -
断点显示 “pending” 却不触发:说明符号未就绪,常见于模板函数或内联函数,尝试
b 'std::vector加引号,或先::size' run让符号动态加载后再设断点 -
打印 vector/string 显示不友好:Xcode 命令行工具自带
libcxx自定义格式化脚本。确保~/.lldbinit包含:command source /Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Resources/Python/lldb/utils/libcxx.py
然后在 LLDB 中执行type summary add -x "std::.*" --summary-string "${var}" --python-class libcxx.stdstring.SyntheticStringProvider(更推荐直接用 Xcode 自带的lldb,它默认启用这些)











