ChatGPT解决这个技术问题 Extra ChatGPT

使用 cargo 时如何获得带有调试信息的发布版本?

以下命令

$ cargo build

生成带有调试信息的非优化构建。相反,

$ cargo build --release

在没有调试信息的情况下生成优化的构建。

有没有办法使用调试信息生成优化的构建?我需要这个来获得有意义的分析信息。


S
Shepmaster

Rust 1.57 开始,Cargo 现在允许 custom profiles。这允许您定义自己的配置文件来添加调试信息:

[profile.release-with-debug]
inherits = "release"
debug = true

然后,您可以在构建时使用该配置文件:

% cargo build --profile=release-with-debug
   Compiling buggin v0.1.0 (/tmp/buggin)
    Finished release-with-debug [optimized + debuginfo] target(s) in 0.48s

在此版本之前,或者如果您总是想要调试信息,您可以修改 release profile 以包含调试符号:

[profile.release]
debug = true

请注意,release 配置文件和 bench 配置文件不同。

也可以看看

可以使用 Cargo 在发布模式下构建测试吗?

如何在启用溢出检查的情况下编译和运行优化的 Rust 程序

Cargo 是否支持自定义配置文件?

或者基本上是“锈迹分析”的任何热门搜索结果:

在 OSX 上使用 Instruments 和 FlameGraph 进行 Rust 分析:CPU/时间

在 Linux 上分析 Rust 应用程序

使用 callgrind 分析 rust 代码


最后一个链接(使用 callgrind 分析 rust 代码)似乎已失效。我只能找到这个相关的 reddit post,它包含相同的死链接。
这实际上产生了一个胖二进制文件,有没有一种方法可以产生调试符号但又能有一个瘦二进制文件。我有一个 9MB 的 .a 文件,这个设置使它达到 40MB
@Pacu 与这个问题无关。将调试信息拆分到单独的位置是特定于平台的。请参阅Will debug symbols affect the performance in Rust?
设置相同参数的另一种方法是通过 CARGO_PROFILE_RELEASE_DEBUG 环境变量。您可以将其设置为“真”。
S
Shepmaster

我发现不需要更改 Cargo.toml 的另一个选项是使用 RUSTFLAGS 环境变量:

$ RUSTFLAGS=-g cargo build --release