Skip to content

使用调试器

本页内容不是关于配置Zed的调试器。 它介绍在开发Zed本身时如何使用调试器。

使用Zed内置的调试器

在Zed项目打开状态下,你可以打开新进程模态框并选择调试标签页。在那里你可以看到两个用于调试Zed的配置,一个用于GDB,一个用于LLDB。选择你想要的配置,Zed将会构建并启动��二进制文件。

GDB在Apple Silicon Mac上不支持。

发布构建配置注意事项

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

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

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

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

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

要在发布构建中获得完整的调试器体验,请使用完整的调试信息编译Zed二进制文件。

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

sh
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默认不会安装在Windows上。请使用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

调试Panics和崩溃

调试器对于查找panics和崩溃的原因很有用,在Zed中也是如此。

默认情况下,当附加到gdblldb的进程遇到panic等异常时,调试器会在该点停止,以便你可以检查程序状态。

初始停止点通常在Rust标准库的panic或异常处理代码中,所以通常需要回溯堆栈以找到根本原因。

lldb中,使用backtrace配合frame selectgdb提供等效的命令。

程序在异常停止后,通常无法继续正常执行。你仍然可以在堆栈帧之间移动并检查变量和表达式,这通常足以识别崩溃原因。

你可以在这里找到更多关于调试Zed崩溃的附加信息。