Backtrace on windows ARM

This is the code used to replicate the issue

use std::backtrace::Backtrace;

pub fn register_panic_handler() {
    std::panic::set_hook(Box::new(move |panic_info| {
        let pid = std::process::id();
        eprintln!("process {} panicked", std::process::id());
        eprintln!("{}", panic_info);
        let backtrace = Backtrace::force_capture();
        eprintln!("{:#?}", backtrace);
    }));
}


fn foo() {
    panic!("foo");
}

fn bar() {
    foo()
}

fn main() {
    register_panic_handler();
    None::<u8>.unwrap();
}

I am using a Windows ARM VM on a MacBook.

When running the following I have an incomplete backtrace

Backtrace [
    { fn: "std::backtrace_rs::backtrace::dbghelp64::trace", file: "/rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14\library/std\src\..\..\backtrace\src\backtrace\dbghelp64.rs", line: 91 },
    { fn: "std::backtrace_rs::backtrace::trace_unsynchronized", file: "/rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14\library/std\src\..\..\backtrace\src\backtrace\mod.rs", line: 66 },
    { fn: "std::backtrace::Backtrace::create", file: "/rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14\library/std\src\backtrace.rs", line: 331 },
    { fn: "__ImageBase" },
    { fn: "alloc::boxed::impl$50::call", file: "/rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14\library/alloc\src\boxed.rs", line: 2245 },
    { fn: "std::panicking::rust_panic_with_hook", file: "/rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14\library/std\src\panicking.rs", line: 805 },
    { fn: "std::panicking::begin_panic_handler::closure$0", file: "/rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14\library/std\src\panicking.rs", line: 664 },
    { fn: "std::sys::backtrace::__rust_end_short_backtrace<std::panicking::begin_panic_handler::closure_env$0,never$>", file: "/rustc/f6e511eec7342f59a25f7c0534f1dbea00d01b14\library/std\src\sys\backtrace.rs", line: 170 },
]

Nothing about main, foo or bar. But when running the same code on any other target (MacOS ARM, Windows x86, MacOs x86, Linux, ...) I have the correct backtrace

Backtrace [
    { fn: "std::backtrace_rs::backtrace::libunwind::trace", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/../../backtrace/src/backtrace/libunwind.rs", line: 104 },
    { fn: "std::backtrace_rs::backtrace::trace_unsynchronized", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/../../backtrace/src/backtrace/mod.rs", line: 66 },
    { fn: "std::backtrace::Backtrace::create", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/backtrace.rs", line: 331 },
    { fn: "toto::register_panic_handler::{{closure}}", file: "./src/main.rs", line: 8 },
    { fn: "<alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/alloc/src/boxed.rs", line: 2021 },
    { fn: "std::panicking::rust_panic_with_hook", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panicking.rs", line: 783 },
    { fn: "std::panicking::begin_panic_handler::{{closure}}", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panicking.rs", line: 649 },
    { fn: "std::sys_common::backtrace::__rust_end_short_backtrace", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/sys_common/backtrace.rs", line: 170 },
    { fn: "rust_begin_unwind", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panicking.rs", line: 645 },
    { fn: "core::panicking::panic_fmt", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/core/src/panicking.rs", line: 72 },
    { fn: "toto::foo", file: "./src/main.rs", line: 15 },
    { fn: "toto::bar", file: "./src/main.rs", line: 19 },
    { fn: "toto::main", file: "./src/main.rs", line: 25 },
    { fn: "core::ops::function::FnOnce::call_once", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/core/src/ops/function.rs", line: 250 },
    { fn: "std::sys_common::backtrace::__rust_begin_short_backtrace", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/sys_common/backtrace.rs", line: 154 },
    { fn: "std::rt::lang_start::{{closure}}", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/rt.rs", line: 167 },
    { fn: "core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/core/src/ops/function.rs", line: 284 },
    { fn: "std::panicking::try::do_call", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panicking.rs", line: 552 },
    { fn: "std::panicking::try", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panicking.rs", line: 516 },
    { fn: "std::panic::catch_unwind", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panic.rs", line: 142 },
    { fn: "std::rt::lang_start_internal::{{closure}}", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/rt.rs", line: 148 },
    { fn: "std::panicking::try::do_call", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panicking.rs", line: 552 },
    { fn: "std::panicking::try", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panicking.rs", line: 516 },
    { fn: "std::panic::catch_unwind", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/panic.rs", line: 142 },
    { fn: "std::rt::lang_start_internal", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/rt.rs", line: 148 },
    { fn: "std::rt::lang_start", file: "/rustc/82e1608dfa6e0b5569232559e3d385fea5a93112/library/std/src/rt.rs", line: 166 },
    { fn: "_main" },
]

Does anyone had the same issue on windows ARM ?

Note that after running the code multiple times in a row (no changes) I had a correct backtrace once (but never reproduced) in hundreds of attempts

How are you compiling this code? To get reasonable backtraces on Windows, you need to compile with debug set to "line-tables-only" or better.

1 Like

I only do cargo run which works on all targets except Windows ARM (even in --release)

I also have this issue on arm64 windows.

I tried

[profile.dev]
debug = "line-tables-only"

but it has no effect. Looking at cargo -v we are passing -C debuginfo=2 to rustc before this setting so it makes sense why this would not help.

Looking at target folder, we are generating plausible pdb files for executables, I'm uncertain if they're being loaded or what.

I was able to coax cargo to print the link options:

 $env:RUSTFLAGS="-Z unstable-options --print link-args"; cargo +nightly build --example main
"C:\\Program Files\\Microsoft Visual Studio\\2022\\Community\\VC\\Tools\\MSVC\\14.42.34433\\bin\\HostARM64\\arm64\\link.exe" "/NOLOGO" "C:\\Users\\drew\\AppData\\Local\\Temp\\rustchArY
Dw\\symbols.o" "C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\examples\\main.1o1v8kwswrb3cyubljp1myvub.rcgu.o" "C:\\Users\\drew\\RustroverProjects\\app_window\\target\
\debug\\examples\\main.8bgvqn4ktv5ud7jwwqgt6xrl4.rcgu.o" "C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\examples\\main.91uayfdphr5217016tpponwff.rcgu.o" "C:\\Users\\dr
ew\\RustroverProjects\\app_window\\target\\debug\\examples\\main.a3j09lpw3yy8m05ne7sng7pc8.rcgu.o" "C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\examples\\main.bn35lt
9sdhaa36qfocpcwjn8s.rcgu.o" "C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\examples\\main.ce1a7psjf9p3293kt63me9auw.rcgu.o" "C:\\Users\\drew\\RustroverProjects\\app_wi
ndow\\target\\debug\\examples\\main.e8mp7b8917glawzch8ni4t192.rcgu.o" "C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\examples\\main.eg0cd95tgoz7pww7ykfbyc84q.rcgu.o" "
C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\examples\\main.03zije6vdrca576wm0g5awwfq.rcgu.o" "C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\deps\\li
bapp_window-8ddd9bd1719810bf.rlib" "C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\deps\\libcontinue-3bcedb96b5fee437.rlib" "C:\\Users\\drew\\RustroverProjects\\app_win
dow\\target\\debug\\deps\\libatomic_waker-7e620bdc7be58c52.rlib" "C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\deps\\libwindows-c0fa5cc70e86c0dc.rlib" "C:\\Users\\dre
w\\RustroverProjects\\app_window\\target\\debug\\deps\\libwindows_core-bc17d6100565bdc1.rlib" "C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\deps\\libwindows_strings-4
543178139a8d827.rlib" "C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\deps\\libwindows_result-55d416dc39c6fff7.rlib" "C:\\Users\\drew\\RustroverProjects\\app_window\\ta
rget\\debug\\deps\\libwindows_targets-970308a4bb6bf25f.rlib" "C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\deps\\libthiserror-ca858ec725f1c62b.rlib" "C:\\Users\\drew\
\RustroverProjects\\app_window\\target\\debug\\deps\\libraw_window_handle-9c20b652fbd15e02.rlib" "C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\a
arch64-pc-windows-msvc\\lib\\libstd-6308f94e0bc88937.rlib" "C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\aarch64-pc-windows-msvc\\lib\\libpanic_
unwind-71f489bc482b370a.rlib" "C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\aarch64-pc-windows-msvc\\lib\\libwindows_targets-1e8dfda66202ebb6.rl
ib" "C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\aarch64-pc-windows-msvc\\lib\\librustc_demangle-4fcdfc75b87e511d.rlib" "C:\\Users\\drew\\.rust
up\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\aarch64-pc-windows-msvc\\lib\\libstd_detect-9e129fcf448e44c0.rlib" "C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64
-pc-windows-msvc\\lib\\rustlib\\aarch64-pc-windows-msvc\\lib\\libhashbrown-1e915246ca51f731.rlib" "C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\
aarch64-pc-windows-msvc\\lib\\librustc_std_workspace_alloc-3f99238e7c3c1729.rlib" "C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\aarch64-pc-windo
ws-msvc\\lib\\libunwind-27f226d462ef88a3.rlib" "C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\aarch64-pc-windows-msvc\\lib\\libcfg_if-dec19a79a1b
e0b69.rlib" "C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\aarch64-pc-windows-msvc\\lib\\liballoc-4b687006732f2189.rlib" "C:\\Users\\drew\\.rustu
p\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\aarch64-pc-windows-msvc\\lib\\librustc_std_workspace_core-124f480fc5923221.rlib" "C:\\Users\\drew\\.rustup\\toolchains\\ni
ghtly-aarch64-pc-windows-msvc\\lib\\rustlib\\aarch64-pc-windows-msvc\\lib\\libcore-460680a42161cd6b.rlib" "C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\aarch64-pc-windows-msvc\\lib\\libcompiler_builtins-c16972b491b670ca.rlib" "C:\\Users\\drew\\.cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows_aarch64_msvc-0.52.6\\lib\\windows.0.52.0.lib" "C:\\Users\\drew\\.cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows_aarch64_msvc-0.52.6\\lib\\windows.0.52.0.lib" "C:\\Users\\drew\\.cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows_aarch64_msvc-0.52.6\\lib\\windows.0.52.0.lib" "C:\\Users\\drew\\.cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows_aarch64_msvc-0.52.6\\lib\\windows.0.52.0.lib" "kernel32.lib" "kernel32.lib" "advapi32.lib" "ntdll.lib" "userenv.lib" "ws2_32.lib" "dbghelp.lib" "/defaultlib:msvcrt" "/NXCOMPAT" "/LIBPATH:C:\\Users\\drew\\.cargo\\registry\\src\\index.crates.io-1949cf8c6b5b557f\\windows_aarch64_msvc-0.52.6\\lib" "/OUT:C:\\Users\\drew\\RustroverProjects\\app_window\\target\\debug\\examples\\main.exe" "/OPT:REF,NOICF" "/DEBUG" "/PDBALTPATH:%_PDB%" "/NATVIS:C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\etc\\intrinsic.natvis" "/NATVIS:C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\etc\\liballoc.natvis" "/NATVIS:C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\etc\\libcore.natvis" "/NATVIS:C:\\Users\\drew\\.rustup\\toolchains\\nightly-aarch64-pc-windows-msvc\\lib\\rustlib\\etc\\libstd.natvis"
warning: `app_window` (example "main") generated 1 warning (run `cargo fix --example "main"` to apply 1 suggestion)

I'm not familiar with the windows linker but it does appear /DEBUG is being passed, which one might hope would use the pdb.