LLVM 项目博客

LLVM 项目新闻及来自一线的细节

LLDB 将登陆 Windows

我们之前曾提到过,我们正在让 Clang 完全支持 Windows 并与 MSVC 兼容。 直到现在,这个故事中还缺少一块重要的拼图,那就是调试 clang 生成的可执行文件。 在过去的 6 个月里,我们开始着手让 LLDB 在 Windows 上良好运行,并支持调试常规 Windows 程序以及 Clang 生成的程序。

为什么不使用现有的调试器,比如 GDB、Visual Studio 的调试器或 WinDBG 呢? 做出这种决定有很多因素。 例如,虽然 GDB 能够理解 Clang 在 Windows 上生成的 DWARF 调试信息,但它并不理解 Microsoft C++ ABI 或调试信息格式。 另一方面,Visual Studio 和 WinDBG 都不理解 Clang 生成的 DWARF 调试信息。 使用 LLDB,我们可以让它支持这两种格式,使其能够用于更广泛的程序。 我们对在 Windows 上开发 LLDB 还有其他原因感到兴奋,比如它与 Clang 的紧密集成,使其能够在其表达式解析器中支持 Clang 在源代码中支持的所有 C++ 特性。 我们还计划继续为调试体验添加新的功能,拥有一个作为更大 LLVM 项目一部分的开源调试器使这变得非常容易。

过去几个月的时间都花在了将 LLDB 的核心代码库移植到 Windows 上。 我们一直在修复 POSIX 假设,增强操作系统抽象层,并从通用代码中删除平台特定的系统调用。 有时我们需要进行重大重构,以便在需要的地方构建抽象以支持平台特定的差异。 我们还努力将测试基础设施移植到 Windows,并设置了构建机器人来确保一切顺利进行。

这项初步的引导工作基本完成,您可以使用 LLDB 调试今天使用 Clang 在 Windows 上生成的简单可执行文件。 请注意“简单”一词的使用。 在最后一次检查中,大约 50% 的 LLDB 测试在 Windows 上失败。 然而,我们的基线,即使用 Clang 和 LLD 构建和链接、使用 DWARF 调试信息、没有共享库的单个 32 位可执行文件(即单线程应用程序),今天已经可以运行。 我们测试了所有基本功能,例如
  1. 各种设置断点的方法(地址、源文件+行号、符号名称等)
  2. 在断点处停止和从断点继续执行
  3. 停止时的进程检查,例如堆栈展开、帧设置、内存检查、局部变量、表达式求值、单步执行等(一个值得注意的例外是,在符号信息有限的情况下,单步执行尚未运行良好)。
当然,还有更多工作要做。 以下是我们计划接下来要做的工作:
  1. 通过提高测试套件的通过率来修复一些容易解决的问题。
  2. 更好地支持调试多线程应用程序。
  3. 支持调试崩溃转储。
  4. 支持调试 x64 二进制文件。
  5. 启用单步执行共享库。
  6. 理解 PDB(用于调试系统库和使用 MSVC 生成的可执行文件)。 虽然 PDB 的确切格式没有公开文档,但 Microsoft 仍然提供了丰富的 API,以 DIA SDK 的形式查询 PDB。
  7. 添加 WinDBG 用户熟悉的调试命令(例如 !handle、!peb 等)
  8. 远程调试
  9. 符号服务器支持
  10. Visual Studio 集成
如果您在 Windows 上使用 Clang,我们鼓励您构建 LLDB(它很快就会出现在 Windows LLVM 安装程序 中),并将您的想法发布到 lldb-dev。 如果您发现任何问题,请务必向 LLDB 提交错误报告,我们也希望您能深入代码并帮助我们。 如果您发现错误,请深入研究并尝试修复它,并将您的补丁发布到 lldb-commits