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

94

下面的命令

$ cargo build

生成一个未经优化的构建,带有调试信息。相反的是,

$ cargo build --release

生成一个优化的构建版本,未包含调试信息。

有没有一种方法可以生成一个同时包含优化调试信息的构建版本?我需要这样做来获取有意义的分析数据。

2个回答

108
截至 Rust 1.57,Cargo现在支持自定义配置文件。这使您可以定义自己的配置文件并添加调试信息:
[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配置文件是不同的。
另请参阅: 或者基本上任何“rust profiling”搜索结果的前几个。

最后一个链接(使用callgrind分析rust代码)似乎已经失效。我只能找到这个相关的reddit帖子,其中包含相同的失效链接。 - MB-F
这实际上会生成一个大型二进制文件,有没有一种方法可以生成调试符号但仍然能够拥有轻量级的二进制文件。我有一个9MB的.a文件,而这个设置会将其增加到40MB。 - Pacu
1
@Pacu 这与本问题无关。将调试信息拆分到单独的位置是特定于平台的。请参见在Rust中,调试符号会影响性能吗? - Shepmaster
2
设置同一参数的另一种方法是通过 CARGO_PROFILE_RELEASE_DEBUG 环境变量。您可以将其设置为 "true"。 - rubdos

85

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

$ RUSTFLAGS=-g cargo build --release

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接