make the panic message more useful (#437)

when panic happend, previouse panic info:
panic occurred: PanicHookInfo { payload: Any { .. }, location: Location { file: "easytier/src/easytier-core.rs", line: 680, col: 9 }, can_unwind: true, force_no_backtrace: false }

the new panic info:

panic occurred: payload:launcher error: "anyhow error: failed to add listener tcp://0.0.0.0:11010", location: Some(Location { file: "easytier/src/easytier-core.rs", line: 680, col: 9 })
backtrace saved to easytier-panic.log
This commit is contained in:
Jiangqiu Shen
2024-10-25 13:33:04 -04:00
committed by GitHub
parent 1ac2e1c8e3
commit 18da94bf33
4 changed files with 27 additions and 1 deletions

View File

@@ -120,3 +120,8 @@ core_clap:
ipv6_listener:
en: "the url of the ipv6 listener, e.g.: tcp://[::]:11010, if not set, will listen on random udp port"
zh-CN: "IPv6 监听器的URL例如tcp://[::]:11010如果未设置将在随机UDP端口上监听"
core_app:
panic_backtrace_save:
en: "backtrace saved to easytier-panic.log"
zh-CN: "回溯信息已保存到easytier-panic.log"

View File

@@ -29,6 +29,8 @@ use easytier::{
utils::{cost_to_str, float_to_str, PeerRoutePair},
};
rust_i18n::i18n!("locales", fallback = "en");
#[derive(Parser, Debug)]
#[command(name = "easytier-cli", author, version = EASYTIER_VERSION, about, long_about = None)]
struct Cli {

View File

@@ -19,3 +19,4 @@ pub mod web_client;
mod tests;
pub const VERSION: &str = common::constants::EASYTIER_VERSION;
rust_i18n::i18n!("locales", fallback = "en");

View File

@@ -128,7 +128,25 @@ pub fn setup_panic_handler() {
use std::io::Write;
std::panic::set_hook(Box::new(|info| {
let backtrace = backtrace::Backtrace::force_capture();
println!("panic occurred: {:?}, backtrace: {:#?}", info, backtrace);
let payload = info.payload();
let payload_str: Option<&str> = if let Some(s) = payload.downcast_ref::<&str>() {
Some(s)
} else if let Some(s) = payload.downcast_ref::<String>() {
Some(s)
} else {
None
};
if let Some(payload_str) = payload_str {
println!(
"panic occurred: payload:{}, location: {:?}",
payload_str,
info.location()
);
} else {
println!("panic occurred: location: {:?}", info.location());
}
println!("{}", rust_i18n::t!("core_app.panic_backtrace_save"));
let _ = std::fs::File::create("easytier-panic.log")
.and_then(|mut f| f.write_all(format!("{:?}\n{:#?}", info, backtrace).as_bytes()));
std::process::exit(1);