入门 Zed Industries 2026-09-14 17:42:20 · 2 阅读

第148章 使用调试器

本页不涉及配置 Zed 调试器的内容,而是介绍在开发 Zed 本身时如何使用调试器。

使用 Zed 内置调试器

在 Zed 项目打开时,你可以打开 New Process Modal 并选择 Debug 选项卡。在那里可以看到两个用于调试 Zed 的调试配置,一个用于 GDB,另一个用于 LLDB。选择你需要的配置后,Zed 会构建并启动二进制文件。

Apple Silicon Mac 不支持 GDB。

Release 构建配置文件注意事项

默认情况下,使用 release 配置文件(nightly、preview 和 stable 使用的配置文件)构建时,包含的调试信息有限。

这是通过设置根目录 Cargo.toml 文件中的 profile.(release).debug 字段为 "limited" 来实现的。

debug 字段的官方文档在此。简而言之,"limited" 会移除类型级别和变量级别的调试信息。

在 release 构建中,这会减小二进制文件大小。类型级别和变量级别的调试信息对于有用的堆栈跟踪并非必需。

然而,当你积极进行调试时,这些数据很重要。没有它们,调试器无法解析局部变量、检查值或使用美化打印器格式化输出。

要在 release 构建中获得完整的调试器体验,请编译一个包含完整调试信息的 Zed 二进制文件。

最简单的方法是在运行 cargo runcargo build 时使用 --config 覆盖根 Cargo.toml 中的 debug 字段:

cargo run --config 'profile.release.debug="full"'
cargo build --config 'profile.release.debug="full"'

如果你不想在每次 cargo 命令中都传递 --config,也可以更改Cargo.toml 中的相关配置段

toml [profile.release] debug = "limited"

改为

toml [profile.release] debug = "full"

这将使所有 cargo run --releasecargo build --release 调用都编译出包含完整调试信息的二进制文件。

警告:不要提交这些更改。

使用 shell 调试器 GDB/LLDB 运行 Zed

背景

通过 rustup 安装 Rust 时(这是 Zed 开发的推荐配置,请参阅平台指南此处),rustup 会同时安装用于调试 Rust 二进制文件的辅助脚本。

这些脚本是 rust-gdbrust-lldb

关于这些脚本的更多详情,请访问此处

它们是 gdblldb 的封装脚本,用于注入针对 Rust 特定功能(如美化打印器和类型信息)的命令和标志。

要使用 rust-gdbrust-lldb,需先在系统中安装 gdblldb

上述文章指出,最低支持的版本为 GDB 7.7 和 LLDB 310。在实际应用中,通常建议使用更新版本。

注意:在 Windows 上,由于 gdb 支持不稳定,rust-gdb 默认不安装。请改用 rust-lldb

如果对这些工具不熟悉,可查看 gdb 文档此处lldb 文档此处

在 Zed 中的用法

启用完整调试信息并使用 cargo build 构建后,针对编译生成的 Zed 二进制文件运行 rust-gdbrust-lldb

rust-gdb target/debug/zed
rust-lldb target/debug/zed

也可以附加到正在运行的 Zed 进程(例如通过 cargo run 启动的进程):

rust-gdb -p <pid>
rust-lldb -p <pid>

<pid> 即待附加的 Zed 实例的进程 ID。

查找 PID 时,可使用系统进程工具,如 Windows 的任务管理器或 macOS 的活动监视器。

在 macOS 和 Linux 上也可运行 ps aux | grep zed,或在 Windows 的 PowerShell 中运行 Get-Process | Select-Object Id, ProcessName

调试 Panic 和崩溃

调试器有助于定位 panic 和崩溃的原因,包括 Zed 内部的问题。

默认情况下,当被 gdblldb 附着的进程触发异常(比如 panic)时,调试器会停在那里,方便你检查程序状态。

最初的停点通常位于 Rust 标准库的 panic 或异常处理代码中,所以一般需要沿着调用栈往上走,才能找到根本原因。

lldb 中,可以使用 backtrace 配合 frame selectgdb 也有等效的命令。

程序停在异常处后,通常就无法继续正常执行了,但仍可以在各个栈帧之间切换,查看变量和表达式的值——这往往足以定位崩溃原因。

关于调试 Zed 崩溃问题的更多信息,可以参考这里

评论 (0)