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