如何编译出可调试的 rustc:rust.debug 配置、panic 时获取 backtrace 与 -Z 标志

发布时间:2026/9/9 18:56:32
如何编译出可调试的 rustc:rust.debug 配置、panic 时获取 backtrace 与 -Z 标志 如何编译出可调试的 rustcrust.debug 配置、panic 时获取 backtrace 与 -Z 标志【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust当你需要修改 rustc 编译器本身或者在本地复现一次 Internal Compiler ErrorICE编译器内部错误时默认构建的 rustc 几乎没有调试信息backtrace 里没有行号用 GDB 单步调试也没有符号。这篇文章给出 rust 仓库文档中记录的操作路径在bootstrap.toml中配置rust.debug重新编译出一个带调试信息的 rustc并在 panic 时通过RUST_BACKTRACE1获取带行号的栈回溯以及使用-Z不稳定标志辅助诊断。适用前提你要构建的是 rust 仓库自身的编译器通过 bootstrap 构建系统而不是普通的 Rust 程序。构建入口是仓库根目录下的./x脚本运行它需要本机已安装 Python。准备clone 仓库并创建 bootstrap.toml按 构建指南 的步骤获取源码并初始化配置git clone https://github.com/rust-lang/rust.git cd rust ./x setup./x setup会创建一份带合理默认值的bootstrap.toml。所有可调项的完整清单和说明在 bootstrap.example.toml 中rust.debug相关选项的默认值以该文件中的注释为准。磁盘空间要求均来自构建指南与调试指南构建 stage1 编译器大约需要 1015GB 可用空间若后面把rust.debuginfo-level设为 2会用到35GB 以上磁盘且编译时间明显变长文档原文提示 upwards of 35GB。配置 rust.debug修改 bootstrap.toml默认情况下 rustc 不带大部分调试信息见 compiler-debugging.md。在bootstrap.toml中加入rust.debug true根据 bootstrap.example.toml 的注释rust.debug true会同时影响若干未显式配置的选项包括rust.debug-assertions调试断言代价是少量运行时变慢、rust.debug-logging保留debug!/trace!调用、rust.overflow-checks而rust.debuginfo-level的默认值会变为 1rust.debug true时。也就是说rust.debug true一次开启了debug-assertions、debug-logging等一组选项如果你想单独微调可以显式配置这些子项。用 GDB 调试 rustc 时的额外配置如果你要用 GDB 调试 rustc需要完整符号信息此时把 debuginfo 级别设为 2rust.debug true rust.debuginfo-level 2文档对这两级有明确区分debuginfo-level 1debug true时的默认值可以跟踪执行路径但丢失符号信息debuginfo-level 2符号信息完整但会生成数 GB 的 debuginfo显著拖慢链接过程并占用 35GB 以上磁盘。另外两个与调试相关的边界条件来自 compiler-debugging.md默认配置会启用symbol-mangling-versionv0这要求 GDB 至少是 v10.2。GDB 版本更低时需要在bootstrap.toml中禁用新符号方案rust.new-symbol-mangling false修改任何配置项之后必须重新构建编译器配置才会生效./x build验证构建出的 rustc构建完成后把 stage1 工具链链接到 rustupquickstart 中的做法rustup toolchain link stage1 build/host/stage1 rustc stage1 -vV文档给出的rustc stage1 -vV示例输出中版本号以-dev结尾如rustc 1.48.0-dev说明工具链指向你本地构建的编译器。注意该自建工具链不包含cargorustup 会回退使用已安装的nightly/beta/stable工具链中的cargo。panicICE时获取 backtracerustc 发生 ICE 时设置环境变量RUST_BACKTRACE1即可获得panic!的栈回溯和普通 Rust 程序一样RUST_BACKTRACE1 rustc stage1 error.rsbacktrace 的信息量取决于编译 rustc 时是否配置了debug true默认配置未设rust.debug true下backtrace 没有行号只到函数级别。文档示例节选stack backtrace: 0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace ... 32: rustc_typeck::check_crate ... 37: rustc_driver::run_compiler设置debug true后每帧会附带文件:行号位置信息。文档示例节选stack backtrace: 7: rustc_typeck::check::cast::CastCheck::check at /home/user/rust/compiler/rustc_typeck/src/check/cast.rs:572 ... 34: rustc_driver::run_compiler at /home/user/rust/compiler/rustc_driver/src/lib.rs:253以上两段均为文档示例具体帧数、路径和行号会随你的代码版本变化。两个相关的环境变量与已知限制RUSTC_ICE0可以禁止 rustc 在 ICE 时向当前工作目录写rustc-ice-timestamp-pid.txt文件默认是会产生这个文件的。文档明确说明 backtrace 在 MinGW 上不可用backtraces dont work on MinGW。如果 backtrace 全是unknown文档建议改用 Linux、macOS 或 Windows 上的 MSVC 工具链环境。想要更详细的回溯可用RUST_BACKTRACEfull文档示例输出中的 note 提到该取值。用 -Z 标志辅助诊断编译器自带一批-Z不稳定标志它们只在 nightly 上生效其中许多对调试很有用。查看完整列表rustc stage1 -Z help文档重点介绍了下面几个定位错误消息的产生点-Z treat-err-as-bug-Z treat-err-as-bugn让编译器在第n个错误处直接 panic从而拿到错误发生点的 backtrace省略n时默认按 1 处理即遇到第一个错误就 panic。文档中的完整流程示例fn main() { 1 (); }先正常编译确认能复现错误rustc stage1 error.rs加上-Z treat-err-as-bug后编译器在处理该错误时 panic输出中会包含internal compiler error: unexpected panic以及指向编译器源码位置的栈回溯文档示例中回溯指向rustc::traits::error_reporting::...::report_selection_error等帧。查看错误创建位置-Z track-diagnostics-Z track-diagnostics利用#[track_caller]在每条错误消息旁打印它的创建位置文档示例输出error[E0277]: cannot add () to {integer} -Ztrack-diagnostics: created at compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs:638:39文档指出它与-Z treat-err-as-bug的差异它会对所有错误打印位置、不需要带调试符号编译的编译器、也不必阅读长栈回溯。其他有用标志-Z verbose-internals打印更多对调试有用的内部信息文档原话是 generally enables printing more info that could be useful for debugging-Z eagerly-emit-delayed-bugs把 delayed bugs 变成正常错误直接暴露出来可与-Z treat-err-as-bug组合使用停在特定的 delayed bug 处并获取 backtrace。限制与后续任何bootstrap.toml配置改动后都要重新./x build才生效rust.debug true的编译器因调试断言等检查会稍慢但仍可用bootstrap.example.toml 原文注释debuginfo-level 2只建议在你确实用 GDB 等调试器单步调试时开启平时用默认的 level 1 即可跟踪执行路径需要更深入调试时文档还分别提供了查询调试incrcomp-debugging、后端调试backend/debugging、借用检查器调试borrow-check/debugging以及 tracing 日志输出的专门章节均可从 compiler-debugging.md 内链接进入。【免费下载链接】rustEmpowering everyone to build reliable and efficient software.项目地址: https://gitcode.com/GitHub_Trending/ru/rust创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考