diff options
| author | bors <bors@rust-lang.org> | 2022-02-02 22:03:23 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2022-02-02 22:03:23 +0000 |
| commit | b3800860e123443ffada615538926beed6bc4f85 (patch) | |
| tree | 4c666bc883ba940757f1f63ee612d8f8edc5bfc2 /src | |
| parent | 27f5d830eb11cd7bdc834d6f0d78120976f75443 (diff) | |
| parent | 85930c8f444e1ece1c92a0f9e39814f72d867e43 (diff) | |
| download | rust-b3800860e123443ffada615538926beed6bc4f85.tar.gz rust-b3800860e123443ffada615538926beed6bc4f85.zip | |
Auto merge of #93101 - Mark-Simulacrum:library-backtrace, r=yaahc
Support configuring whether to capture backtraces at runtime
Tracking issue: https://github.com/rust-lang/rust/issues/93346
This adds a new API to the `std::panic` module which configures whether and how the default panic hook will emit a backtrace when a panic occurs.
After discussion with `@yaahc` on [Zulip](https://rust-lang.zulipchat.com/#narrow/stream/219381-t-libs/topic/backtrace.20lib.20vs.2E.20panic), this PR chooses to avoid adjusting or seeking to provide a similar API for the (currently unstable) std::backtrace API. It seems likely that the users of that API may wish to expose more specific settings rather than just a global one (e.g., emulating the `env_logger`, `tracing` per-module configuration) to avoid the cost of capture in hot code. The API added here could plausibly be copied and/or re-exported directly from std::backtrace relatively easily, but I don't think that's the right call as of now.
```rust
mod panic {
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[non_exhaustive]
pub enum BacktraceStyle {
Short,
Full,
Off,
}
fn set_backtrace_style(BacktraceStyle);
fn get_backtrace_style() -> Option<BacktraceStyle>;
}
```
Several unresolved questions:
* Do we need to move to a thread-local or otherwise more customizable strategy for whether to capture backtraces? See [this comment](https://github.com/rust-lang/rust/pull/79085#issuecomment-727845826) for some potential use cases for this.
* Proposed answer: no, leave this for third-party hooks.
* Bikeshed on naming of all the options, as usual.
* Should BacktraceStyle be moved into `std::backtrace`?
* It's already somewhat annoying to import and/or re-type the `std::panic::` prefix necessary to use these APIs, probably adding a second module to the mix isn't worth it.
Note that PR #79085 proposed a much simpler API, but particularly in light of the desire to fully replace setting environment variables via `env::set_var` to control the backtrace API, a more complete API seems preferable. This PR likely subsumes that one.
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/ui/panics/runtime-switch.legacy.run.stderr | 5 | ||||
| -rw-r--r-- | src/test/ui/panics/runtime-switch.rs | 25 | ||||
| -rw-r--r-- | src/test/ui/panics/runtime-switch.v0.run.stderr | 5 | ||||
| -rw-r--r-- | src/tools/tidy/src/pal.rs | 1 |
4 files changed, 36 insertions, 0 deletions
diff --git a/src/test/ui/panics/runtime-switch.legacy.run.stderr b/src/test/ui/panics/runtime-switch.legacy.run.stderr new file mode 100644 index 00000000000..979cc56b831 --- /dev/null +++ b/src/test/ui/panics/runtime-switch.legacy.run.stderr @@ -0,0 +1,5 @@ +thread 'main' panicked at 'explicit panic', $DIR/runtime-switch.rs:24:5 +stack backtrace: + 0: std::panicking::begin_panic + 1: runtime_switch::main +note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. diff --git a/src/test/ui/panics/runtime-switch.rs b/src/test/ui/panics/runtime-switch.rs new file mode 100644 index 00000000000..c1634811406 --- /dev/null +++ b/src/test/ui/panics/runtime-switch.rs @@ -0,0 +1,25 @@ +// Test for std::panic::set_backtrace_style. + +// compile-flags: -O +// run-fail +// check-run-results +// exec-env:RUST_BACKTRACE=0 + +// ignore-msvc see #62897 and `backtrace-debuginfo.rs` test +// ignore-android FIXME #17520 +// ignore-openbsd no support for libbacktrace without filename +// ignore-wasm no panic or subprocess support +// ignore-emscripten no panic or subprocess support +// ignore-sgx no subprocess support + +// NOTE(eddyb) output differs between symbol mangling schemes +// revisions: legacy v0 +// [legacy] compile-flags: -Zunstable-options -Csymbol-mangling-version=legacy +// [v0] compile-flags: -Csymbol-mangling-version=v0 + +#![feature(panic_backtrace_config)] + +fn main() { + std::panic::set_backtrace_style(std::panic::BacktraceStyle::Short); + panic!() +} diff --git a/src/test/ui/panics/runtime-switch.v0.run.stderr b/src/test/ui/panics/runtime-switch.v0.run.stderr new file mode 100644 index 00000000000..48f829c26d4 --- /dev/null +++ b/src/test/ui/panics/runtime-switch.v0.run.stderr @@ -0,0 +1,5 @@ +thread 'main' panicked at 'explicit panic', $DIR/runtime-switch.rs:24:5 +stack backtrace: + 0: std::panicking::begin_panic::<&str> + 1: runtime_switch::main +note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. diff --git a/src/tools/tidy/src/pal.rs b/src/tools/tidy/src/pal.rs index 24a10018779..cb6d56a167d 100644 --- a/src/tools/tidy/src/pal.rs +++ b/src/tools/tidy/src/pal.rs @@ -58,6 +58,7 @@ const EXCEPTION_PATHS: &[&str] = &[ "library/std/src/path.rs", "library/std/src/sys_common", // Should only contain abstractions over platforms "library/std/src/net/test.rs", // Utility helpers for tests + "library/std/src/panic.rs", // fuchsia-specific panic backtrace handling ]; pub fn check(path: &Path, bad: &mut bool) { |
