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