ChatGPT解决这个技术问题 Extra ChatGPT

How to get a release build with debugging information when using cargo?

The following command

$ cargo build

produces a non-optimized build with debugging information. On the contrary,

$ cargo build --release

produces an optimized build without debugging information.

Is there a way of producing an optimized build with debugging information? I need this to get meaningful profiling information.


S
Shepmaster

As of Rust 1.57, Cargo now allows for custom profiles. This allows you to define your own profile that adds debug information:

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

You can then use that profile when building:

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

Prior to this version, or if you always wanted to have debugging information, you can modify the release profile to include debugging symbols:

[profile.release]
debug = true

Note that the release profile and the bench profile differ.

See also

Can tests be built in release mode using Cargo?

How to compile and run an optimized Rust program with overflow checking enabled

Does Cargo support custom profiles?

Or basically any of the top search results for "rust profiling":

Rust Profiling with Instruments and FlameGraph on OSX: CPU/Time

Profiling Rust applications on Linux

Profiling rust code with callgrind


The last link (profiling rust code with callgrind) seems to be dead. I could only find this related reddit post, which contains the same dead link.
This actually produces a fat binary, is there a way of producing the debugging symbols but yet being able to have a thin binary. I have a 9MB .a file and this setting takes it to 40MB
@Pacu that's not related to this question. Splitting debug info to a separate location is platform-specific. See Will debug symbols affect the performance in Rust?
Another way to set the same parameter is through the CARGO_PROFILE_RELEASE_DEBUG environment variable. You can set that to "true".
S
Shepmaster

Another option that I found that does not require changing Cargo.toml is to use the RUSTFLAGS environment variable:

$ RUSTFLAGS=-g cargo build --release