Skip to content

Commit 8f12f52

Browse files
jyn514gitbot
authored and
gitbot
committed
Improve comments for the default backtrace printer
The existing comments were misleading, confusing, and wrong. Take this comment for example: ``` // Any frames between `__rust_begin_short_backtrace` and `__rust_end_short_backtrace` // are omitted from the backtrace in short mode, `__rust_end_short_backtrace` will be // called before the panic hook, so we won't ignore any frames if there is no // invoke of `__rust_begin_short_backtrace`. ``` this is just wrong. here is an example (full) backtrace: ``` Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.01s Running `/home/jyn/.local/lib/cargo/target/debug/example` called `Option::unwrap()` on a `None` value stack backtrace: 0: 0x56499698c595 - std::backtrace_rs::backtrace::libunwind::trace::h5ef2cc16e9a7415a 1: 0x56499698c595 - std::backtrace_rs::backtrace::trace_unsynchronized::h9b5e016e9075f714 2: 0x56499698c595 - std::sys_common::backtrace::_print_fmt::h2f62c7f9ff224e93 3: 0x56499698c595 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::hbe51682735731910 4: 0x5649969aa26b - core::fmt::rt::Argument::fmt::h1994ab2b310d665e 5: 0x5649969aa26b - core::fmt::write::hade58a36d63468d7 6: 0x56499698a43f - std::io::Write::write_fmt::h16145587d801a9ab 7: 0x56499698c36e - std::sys_common::backtrace::_print::ha8082e56201dadb4 8: 0x56499698c36e - std::sys_common::backtrace::print::he30f96b4e7f6cbfd 9: 0x56499698d709 - std::panicking::default_hook::{{closure}}::hf0801f6b18a968d3 10: 0x56499698d4ac - std::panicking::default_hook::hd2defec7eda5aeb0 11: 0x56499698dc31 - std::panicking::rust_panic_with_hook::hde93283600065c53 12: 0x56499698daf3 - std::panicking::begin_panic_handler::{{closure}}::h5e151adbdb7ec0c1 13: 0x56499698ca59 - std::sys_common::backtrace::__rust_end_short_backtrace::he36a1407e0f77700 14: 0x56499698d7d4 - rust_begin_unwind 15: 0x5649969a9503 - core::panicking::panic_fmt::h2380d41365f95412 16: 0x5649969a958c - core::panicking::panic::h38cf8db80e8c6e67 17: 0x5649969a93e9 - core::option::unwrap_failed::he72696e53ff29a05 18: 0x5649969722b6 - core::option::Option<T>::unwrap::hb574dc0dc1703062 19: 0x5649969722b6 - example::main::h7a867aafacd93d75 20: 0x5649969721db - core::ops::function::FnOnce::call_once::h734f99a5e57291b7 21: 0x56499697226e - std::sys_common::backtrace::__rust_begin_short_backtrace::h02f5d58c351c4756 22: 0x564996972241 - std::rt::lang_start::{{closure}}::h8b134fe2c31a4355 23: 0x564996988662 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::h88d7bb571ee2aaf4 24: 0x564996988662 - std::panicking::try::do_call::hfb78dfb6599c871d 25: 0x564996988662 - std::panicking::try::habd041c8c4c8e50c 27: 0x564996988662 - std::rt::lang_start_internal::{{closure}}::h227591a6f9c0879e 28: 0x564996988662 - std::panicking::try::do_call::h3c5878333c38916a 29: 0x564996988662 - std::panicking::try::h5af7b3a127cdae70 31: 0x564996988662 - std::rt::lang_start_internal::hbc85e809eeace0dd 32: 0x56499697221a - std::rt::lang_start::ha1eb16922c9cb224 33: 0x5649969722ee - main 34: 0x7f031962a1ca - __libc_start_call_main 35: 0x7f031962a28b - __libc_start_main_impl 36: 0x5649969720a5 - _start 37: 0x0 - <unknown> ``` note particularly frames 13-21, from start_backtrace to end_backtrace. with PrintFmt::Short, these are the *only* frames that are printed; i.e. we are doing the exact opposite of the comment.
1 parent fa8ba98 commit 8f12f52

File tree

1 file changed

+12
-14
lines changed

1 file changed

+12
-14
lines changed

std/src/sys/backtrace.rs

+12-14
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ unsafe fn _print_fmt(fmt: &mut fmt::Formatter<'_>, print_fmt: PrintFmt) -> fmt::
5858
let mut res = Ok(());
5959
let mut omitted_count: usize = 0;
6060
let mut first_omit = true;
61-
// Start immediately if we're not using a short backtrace.
62-
let mut start = print_fmt != PrintFmt::Short;
61+
// If we're using a short backtrace, ignore all frames until we're told to start printing.
62+
let mut print = print_fmt != PrintFmt::Short;
6363
set_image_base();
6464
// SAFETY: we roll our own locking in this town
6565
unsafe {
@@ -72,27 +72,25 @@ unsafe fn _print_fmt(fmt: &mut fmt::Formatter<'_>, print_fmt: PrintFmt) -> fmt::
7272
backtrace_rs::resolve_frame_unsynchronized(frame, |symbol| {
7373
hit = true;
7474

75-
// Any frames between `__rust_begin_short_backtrace` and `__rust_end_short_backtrace`
76-
// are omitted from the backtrace in short mode, `__rust_end_short_backtrace` will be
77-
// called before the panic hook, so we won't ignore any frames if there is no
78-
// invoke of `__rust_begin_short_backtrace`.
75+
// `__rust_end_short_backtrace` means we are done hiding symbols
76+
// for now. Print until we see `__rust_begin_short_backtrace`.
7977
if print_fmt == PrintFmt::Short {
8078
if let Some(sym) = symbol.name().and_then(|s| s.as_str()) {
81-
if start && sym.contains("__rust_begin_short_backtrace") {
82-
start = false;
79+
if sym.contains("__rust_end_short_backtrace") {
80+
print = true;
8381
return;
8482
}
85-
if sym.contains("__rust_end_short_backtrace") {
86-
start = true;
83+
if print && sym.contains("__rust_begin_short_backtrace") {
84+
print = false;
8785
return;
8886
}
89-
if !start {
87+
if !print {
9088
omitted_count += 1;
9189
}
9290
}
9391
}
9492

95-
if start {
93+
if print {
9694
if omitted_count > 0 {
9795
debug_assert!(print_fmt == PrintFmt::Short);
9896
// only print the message between the middle of frames
@@ -112,7 +110,7 @@ unsafe fn _print_fmt(fmt: &mut fmt::Formatter<'_>, print_fmt: PrintFmt) -> fmt::
112110
});
113111
#[cfg(target_os = "nto")]
114112
if libc::__my_thread_exit as *mut libc::c_void == frame.ip() {
115-
if !hit && start {
113+
if !hit && print {
116114
use crate::backtrace_rs::SymbolName;
117115
res = bt_fmt.frame().print_raw(
118116
frame.ip(),
@@ -123,7 +121,7 @@ unsafe fn _print_fmt(fmt: &mut fmt::Formatter<'_>, print_fmt: PrintFmt) -> fmt::
123121
}
124122
return false;
125123
}
126-
if !hit && start {
124+
if !hit && print {
127125
res = bt_fmt.frame().print_raw(frame.ip(), None, None, None);
128126
}
129127

0 commit comments

Comments
 (0)