Clang 未在 -g 标志上生成调试信息

Lin*_*nk0 11 c c++ windows llvm clang

在 Windows 上使用 clang v8.0.0(来自 llvm 预构建二进制文件)时,gdb 或 lldb 调试器不会选择源映射表-g-gline-tables-only源映射表。

包含-g标志文件的大小会增加(这是意料之中的),但 gdb 和 lldb 都没有选择源

当使用 gcc 编译-g时,调试器会检测到(带有标志)源文件。

我曾尝试clang -g <codefile>在 macOS High Sierra(clang -v说它是)上运行相同的命令 ( ),Apple LLVM version 10.0.0 (clang-1000/10.44.4)其中 lldb 正在获取源文件。所以我猜它是本地化到我的 widows 实例或 llvm for windows build。

clang -vWindows 上的PS 输出:

clang version 8.0.0 (tags/RELEASE_800/final)
Target: x86_64-pc-windows-msvc
Thread model: posix
InstalledDir: C:\Program Files\LLVM\bin
Run Code Online (Sandbox Code Playgroud)

Hol*_*Cat 6

在 Windows 上,Clang 不是自给自足的(至少不是官方二进制文件)。您需要安装 GCC 或 MSVC 才能运行。

如图Target: x86_64-pc-windows-msvc所示,默认情况下,您的 Clang 以某种 MSVC 兼容模式运行。从我收集到的信息来看,这意味着使用 MSVC 安装提供的标准库和其他库,并可能以某些特定于 MSVC 的格式生成调试信息。

添加--target=x86_64-w64-windows-gnu以 GCC 兼容模式构建。(如果您正在构建 32 位而不是 64 位,请替换x86_64i686)。这将使 Clang 使用 GCC 安装提供的头文件和库,并且调试信息应该以 GCC 兼容的方式生成。我能够使用 MSYS2 的 GDB 调试生成的二进制文件(这也是我的 GCC 安装的来源)。

如果你只安装了 GCC 而没有安装 MSVC,你仍然必须使用这个标志。

我怎么知道这是正确的--target?这就是 MSYS2 的 Clang 使用的,我假设他们知道他们在做什么。如果你不想每次都输入这个标志,你可以用 MSYS2 的标志替换官方的 Clang,但我不确定这是否是最好的主意。
(我认为他们曾经提供了一些补丁来增加与 MinGW 的兼容性,但现在官方二进制文件同样运行良好,除了需要指定目标。另外,上次我检查他们的二进制分发版时大了几 GB,因为它们无法动态链接工作。此外,他们提供的一些版本容易崩溃。所有这些问题都来自他们使用 MinGW 构建 Clang,而 Clang 似乎开箱即用的支持不太好。在他们的辩护中,他们正在积极维护他们的发行版,我认为他们甚至为 Windows 提供了 libc++,而官方发行版没有这样做。)