about summary refs log tree commit diff
path: root/library/std/src/sys_common/backtrace.rs
diff options
context:
space:
mode:
authoryukang <moorekang@gmail.com>2023-03-09 22:05:57 +0800
committeryukang <moorekang@gmail.com>2023-05-17 17:56:26 +0800
commitc3394b3eaa0f6fa135ddca67c3cabb3e9cd41a04 (patch)
treee47317ba9e7ef5b3196c62a12a97c7adc66f4d5f /library/std/src/sys_common/backtrace.rs
parentc2ccc855e74aec03e434405eca3c247ee2432e53 (diff)
downloadrust-c3394b3eaa0f6fa135ddca67c3cabb3e9cd41a04.tar.gz
rust-c3394b3eaa0f6fa135ddca67c3cabb3e9cd41a04.zip
Fix #107910, Shorten backtraces in ICEs
Diffstat (limited to 'library/std/src/sys_common/backtrace.rs')
-rw-r--r--library/std/src/sys_common/backtrace.rs11
1 files changed, 6 insertions, 5 deletions
diff --git a/library/std/src/sys_common/backtrace.rs b/library/std/src/sys_common/backtrace.rs
index 8752f46ff81..6f020940df1 100644
--- a/library/std/src/sys_common/backtrace.rs
+++ b/library/std/src/sys_common/backtrace.rs
@@ -68,13 +68,17 @@ unsafe fn _print_fmt(fmt: &mut fmt::Formatter<'_>, print_fmt: PrintFmt) -> fmt::
         }
 
         let mut hit = false;
-        let mut stop = false;
         backtrace_rs::resolve_frame_unsynchronized(frame, |symbol| {
             hit = true;
+
+            // 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`.
             if print_fmt == PrintFmt::Short {
                 if let Some(sym) = symbol.name().and_then(|s| s.as_str()) {
                     if start && sym.contains("__rust_begin_short_backtrace") {
-                        stop = true;
+                        start = false;
                         return;
                     }
                     if sym.contains("__rust_end_short_backtrace") {
@@ -88,9 +92,6 @@ unsafe fn _print_fmt(fmt: &mut fmt::Formatter<'_>, print_fmt: PrintFmt) -> fmt::
                 res = bt_fmt.frame().symbol(frame, symbol);
             }
         });
-        if stop {
-            return false;
-        }
         #[cfg(target_os = "nto")]
         if libc::__my_thread_exit as *mut libc::c_void == frame.ip() {
             if !hit && start {