Clang 不在 -g 标志上生成调试信息
Clang not generating debug info on -g flag
当在 Windows (from llvm prebuilt binaries) 上使用带有 -g
或 -gline-tables-only
的 clang v8.0.0 时,gdb 或未拾取源映射表lldb 调试器。
包含 -g
标志后文件的大小会增加(这是可以预料的)但 gdb 和 lldb 都不会选择源代码
虽然使用 gcc 编译时(使用 -g
标志)调试器检测到源文件。
我已经在 macOS High Sierra(clang -v
说它是 Apple LLVM version 10.0.0 (clang-1000/10.44.4)
)上尝试了 运行 相同的命令(clang -g <codefile>
),其中正在获取源文件通过 lldb。所以我猜它是本地化到我的 widows 实例或 llvm for windows build.
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
在 Windows 上,Clang 不是 self-sufficient(至少不是官方二进制文件)。您需要安装 GCC 或 MSVC 才能运行。
如 Target: x86_64-pc-windows-msvc
所示,默认情况下您的 Clang 以某种 MSVC-compatible 模式运行。根据我的收集,这意味着使用标准库和您的 MSVC 安装提供的其他库,并可能以某种 MSVC-specific 格式生成调试信息。
添加 --target=x86_64-w64-windows-gnu
以在 GCC-compatible 模式下构建。 (如果您构建的是 32 位而不是 64 位,请将 x86_64
替换为 i686
)。这将使 Clang 使用 GCC 安装提供的 headers 和库,并且调试信息应该以 GCC-compatible 的方式生成。我能够使用 MSYS2 的 GDB 调试生成的二进制文件(这也是我的 GCC 安装的来源)。
如果你只安装了 GCC 而没有安装 MSVC,你仍然必须使用这个标志。
我怎么知道这是正确的 --target
?这就是 MSYS2 的 Clang 使用的,我假设他们知道他们在做什么。如果你不想每次都输入这个标志,你可以用MSYS2的替换官方的Clang,但我不确定这是否是最好的主意。
(我认为他们曾经提供一些补丁来增加与MinGW的兼容性,但现在官方二进制文件同样可以正常工作,除了需要指定目标。另外,我上次查看他们的二进制文件分布是几个GB更大,由于他们无法获得动态链接工作。他们提供的一些版本也容易崩溃。所有这些问题都来自他们使用 MinGW 构建他们的 Clang,Clang 似乎不能很好地支持框。在他们的辩护中,他们正在积极维护他们的发行版,我认为他们甚至为 Windows 发布了 libc++,而官方发行版没有这样做。)
当在 Windows (from llvm prebuilt binaries) 上使用带有 -g
或 -gline-tables-only
的 clang v8.0.0 时,gdb 或未拾取源映射表lldb 调试器。
包含 -g
标志后文件的大小会增加(这是可以预料的)但 gdb 和 lldb 都不会选择源代码
虽然使用 gcc 编译时(使用 -g
标志)调试器检测到源文件。
我已经在 macOS High Sierra(clang -v
说它是 Apple LLVM version 10.0.0 (clang-1000/10.44.4)
)上尝试了 运行 相同的命令(clang -g <codefile>
),其中正在获取源文件通过 lldb。所以我猜它是本地化到我的 widows 实例或 llvm for windows build.
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
在 Windows 上,Clang 不是 self-sufficient(至少不是官方二进制文件)。您需要安装 GCC 或 MSVC 才能运行。
如 Target: x86_64-pc-windows-msvc
所示,默认情况下您的 Clang 以某种 MSVC-compatible 模式运行。根据我的收集,这意味着使用标准库和您的 MSVC 安装提供的其他库,并可能以某种 MSVC-specific 格式生成调试信息。
添加 --target=x86_64-w64-windows-gnu
以在 GCC-compatible 模式下构建。 (如果您构建的是 32 位而不是 64 位,请将 x86_64
替换为 i686
)。这将使 Clang 使用 GCC 安装提供的 headers 和库,并且调试信息应该以 GCC-compatible 的方式生成。我能够使用 MSYS2 的 GDB 调试生成的二进制文件(这也是我的 GCC 安装的来源)。
如果你只安装了 GCC 而没有安装 MSVC,你仍然必须使用这个标志。
我怎么知道这是正确的 --target
?这就是 MSYS2 的 Clang 使用的,我假设他们知道他们在做什么。如果你不想每次都输入这个标志,你可以用MSYS2的替换官方的Clang,但我不确定这是否是最好的主意。
(我认为他们曾经提供一些补丁来增加与MinGW的兼容性,但现在官方二进制文件同样可以正常工作,除了需要指定目标。另外,我上次查看他们的二进制文件分布是几个GB更大,由于他们无法获得动态链接工作。他们提供的一些版本也容易崩溃。所有这些问题都来自他们使用 MinGW 构建他们的 Clang,Clang 似乎不能很好地支持框。在他们的辩护中,他们正在积极维护他们的发行版,我认为他们甚至为 Windows 发布了 libc++,而官方发行版没有这样做。)