铛没有在-g标志上生成调试信息

时间:2019-05-06 11:56:56

标签: c++ c windows clang llvm

在Windows from llvm prebuilt binaries-g-gline-tables-only上使用clang v8.0.0时,gdb或lldb调试器不会获取源映射表。

包含-g标志文件的大小会增大(这是可以预期的),但gdb和lldb都没有选择源代码

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

我尝试在macOS High Sierra(clang -g <codefile>说是clang -v)上运行相同的命令(Apple LLVM version 10.0.0 (clang-1000/10.44.4))的情况下,lldb在那里拾取了源文件。因此,我猜想它已本地化到我的widows实例或用于Windows构建的llvm。

P.S。 clang -v在Windows上的输出:

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

1 个答案:

答案 0 :(得分: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_64替换i686)。这将使Clang使用您的GCC安装提供的标头和库,并且调试信息应以与GCC兼容的方式生成。我可以使用MSYS2的GDB调试生成的二进制文件(这也是我的GCC安装所在的位置)。

如果仅安装了GCC而不是MSVC,则仍必须使用此标志。

我怎么知道这是正确的--target?这就是MSYS2的Clang所使用的,我假设他们知道他们在做什么。如果您不想每次都键入此标志,则可以用MSYS2的Clang代替官方的Clang,但是我不确定这是否是最好的主意。
(我认为他们曾经提供一些补丁来增强与MinGW的兼容性,但是现在官方二进制文件同样工作良好,除了需要指定目标。此外,我上次检查它们的二进制发行版要大几GB,由于他们无法获得动态链接以工作,他们提供的某些版本也容易崩溃,所有这些问题都来自于他们用MinGW构建Clang,而Clang似乎并没有很好地支持。为了捍卫自己的利益,他们正在积极维护其发行版,我认为他们甚至为Windows发行了libc ++,而官方发行版则没有。)