必须加-g生成DWARF调试信息,配合-O0禁用优化,否则断点不命中、变量不可见、调用栈异常;老版GDB需额外加-gdwarf-4,C++26特性调试还需显式启用实验标志。

装完 Clang 不能直接按 F5 就调试,得先让编译器生成带调试信息的可执行文件,并确保调试器能读取它——否则断点不命中、变量看不了、调用栈是问号。
clang++ 必须加 -g 才能调试
Clang 默认不嵌入任何调试信息,clang++ 编译出来的二进制文件对 GDB 或 LLDB 来说就是“黑盒”。加 -g 是唯一前提:
-
clang++ -g -o main main.cpp—— 最小可用命令 - 别只写
clang++ main.cpp,它连a.out都没调试符号 -
-g生成的是 DWARF 格式数据,不是所有调试器都默认支持最新版;如果用老版本 GDB,可能需加-gdwarf-4 - 配合
-O0(禁用优化):否则变量被优化掉、内联函数消失、行号错位——这是新手最常踩的坑
调试器选 GDB 还是 LLDB?看你的系统和工具链
Clang 生成的调试信息对两者都兼容,但实际体验差异明显:
- Linux/macOS 上用
lldb更稳:lldb ./main→breakpoint set --name main→run - Windows 或 Dev-C++ 环境基本只能靠
gdb,但必须确认 GDB 版本 ≥ 12(GDB 10.2 对 Clang 17 的 DWARF-5 支持不全) - VS Code 调试时,
launch.json里"miDebuggerPath"必须指向真实gdb或lldb可执行文件,不能只写名字 - 别信“自动检测”——很多 IDE 在 Clang + C++26 场景下会漏加载模块调试信息,手动加
-fmodules -g -Xclang -emit-module-debug-info才行
C++26 实验特性调试要多加一层开关
用 -std=c++26 或 -std=c++2b 本身不等于能调试新语法,Clang 把实验特性单独锁住:
立即学习“C++免费学习笔记(深入)”;
- 必须显式加
-Xclang -enable-cxx26(或-Xclang -enable-cxx26-experimental),否则std::generator这类东西编译过,但调试器看不到协程帧 - 模块(
.cppm或.ixx)调试必须带-fmodules和-Xclang -emit-module-debug-info,否则module list在 LLDB 里为空 - 启用
-fcoroutines后,协程挂起点的调试依赖-g+-O0+-Xclang -debug-info-kind=standalone,缺一不可 - Clang 17 对 C++26 的静态反射(
reflexpr)仅提供 AST 层支持,不生成运行时调试符号——别指望在断点里print出类型元数据
真正卡住调试的往往不是语法错误,而是调试信息没生成、调试器版本太旧、或者 C++26 实验标志漏了一项。每次改完编译参数,用 objdump -g ./main | head -n 10 看一眼有没有 DW_TAG,比反复重启调试器快得多。


















