From 0dfe40e742a1a4c7fe79dee7ea136584a24b3910 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 19 Jul 2018 14:14:30 +0200 Subject: [PATCH] Panic hook (#379) * Panic hook * Abort on panic in release --- substrate/Cargo.lock | 3 +- substrate/Cargo.toml | 3 ++ substrate/polkadot/cli/Cargo.toml | 1 + substrate/polkadot/cli/src/lib.rs | 4 ++ substrate/polkadot/cli/src/panic_hook.rs | 68 ++++++++++++++++++++++++ 5 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 substrate/polkadot/cli/src/panic_hook.rs diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index 52f332c939..c4d04d2aa5 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -1843,6 +1843,7 @@ dependencies = [ "ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", "app_dirs 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.10 (registry+https://github.com/rust-lang/crates.io-index)", + "backtrace 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)", "ed25519 0.1.0", "env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -4026,9 +4027,9 @@ dependencies = [ "checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" "checksum multiaddr 0.3.0 (git+https://github.com/tomaka/libp2p-rs?rev=727e0e099b53a4032a7e2330994c819fe866add7)" = "" "checksum multibase 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b9c35dac080fd6e16a99924c8dfdef0af89d797dd851adab25feaffacf7850d6" -"checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" "checksum multihash 0.8.1-pre (git+https://github.com/tomaka/libp2p-rs?rev=727e0e099b53a4032a7e2330994c819fe866add7)" = "" "checksum multistream-select 0.1.0 (git+https://github.com/tomaka/libp2p-rs?rev=727e0e099b53a4032a7e2330994c819fe866add7)" = "" +"checksum names 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ef320dab323286b50fb5cdda23f61c796a72a89998ab565ca32525c5c556f2da" "checksum nan-preserving-float 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34d4f00fcc2f4c9efa8cc971db0da9e28290e28e97af47585e48691ef10ff31f" "checksum native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f74dbadc8b43df7864539cedb7bc91345e532fdd913cfdc23ad94f4d2d40fbc0" "checksum net2 0.2.32 (registry+https://github.com/rust-lang/crates.io-index)" = "9044faf1413a1057267be51b5afba8eb1090bd2231c693664aa1db716fe1eae0" diff --git a/substrate/Cargo.toml b/substrate/Cargo.toml index 0c3402039e..ffd639ca88 100644 --- a/substrate/Cargo.toml +++ b/substrate/Cargo.toml @@ -84,3 +84,6 @@ travis-ci = { repository = "paritytech/polkadot", branch = "master" } maintenance = { status = "actively-developed" } is-it-maintained-issue-resolution = { repository = "paritytech/polkadot" } is-it-maintained-open-issues = { repository = "paritytech/polkadot" } + +[profile.release] +panic = "abort" diff --git a/substrate/polkadot/cli/Cargo.toml b/substrate/polkadot/cli/Cargo.toml index fe25cb45c2..3f6505ba6f 100644 --- a/substrate/polkadot/cli/Cargo.toml +++ b/substrate/polkadot/cli/Cargo.toml @@ -6,6 +6,7 @@ description = "Polkadot node implementation in Rust." [dependencies] clap = { version = "2.27", features = ["yaml"] } +backtrace = "0.3" env_logger = "0.4" error-chain = "0.12" log = "0.3" diff --git a/substrate/polkadot/cli/src/lib.rs b/substrate/polkadot/cli/src/lib.rs index 1810922c7b..6257116d6b 100644 --- a/substrate/polkadot/cli/src/lib.rs +++ b/substrate/polkadot/cli/src/lib.rs @@ -33,6 +33,7 @@ extern crate parking_lot; extern crate serde; extern crate serde_json; extern crate names; +extern crate backtrace; extern crate substrate_client as client; extern crate substrate_network as network; @@ -66,6 +67,7 @@ extern crate log; pub mod error; mod informant; mod chain_spec; +mod panic_hook; pub use chain_spec::ChainSpec; pub use client::error::Error as ClientError; @@ -166,6 +168,8 @@ pub fn run(args: I, worker: W) -> error::Result<()> where T: Into + Clone, W: Worker, { + panic_hook::set(); + let yaml = load_yaml!("./cli.yml"); let matches = match clap::App::from_yaml(yaml).version(&(crate_version!().to_owned() + "\n")[..]).get_matches_from_safe(args) { Ok(m) => m, diff --git a/substrate/polkadot/cli/src/panic_hook.rs b/substrate/polkadot/cli/src/panic_hook.rs new file mode 100644 index 0000000000..fa48ce08cb --- /dev/null +++ b/substrate/polkadot/cli/src/panic_hook.rs @@ -0,0 +1,68 @@ +// Copyright 2017 Parity Technologies (UK) Ltd. +// This file is part of Polkadot. + +// Polkadot is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. + +// Polkadot is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License +// along with Polkadot. If not, see . + +//! Custom panic hook with bug report link + +use backtrace::Backtrace; +use std::io::{self, Write}; +use std::panic::{self, PanicInfo}; +use std::thread; + +/// Set the panic hook +pub fn set() { + panic::set_hook(Box::new(panic_hook)); +} + +static ABOUT_PANIC: &str = " +This is a bug. Please report it at: + + https://github.com/paritytech/polkadot/issues/new +"; + +fn panic_hook(info: &PanicInfo) { + let location = info.location(); + let file = location.as_ref().map(|l| l.file()).unwrap_or(""); + let line = location.as_ref().map(|l| l.line()).unwrap_or(0); + + let msg = match info.payload().downcast_ref::<&'static str>() { + Some(s) => *s, + None => match info.payload().downcast_ref::() { + Some(s) => &s[..], + None => "Box", + } + }; + + let thread = thread::current(); + let name = thread.name().unwrap_or(""); + + let backtrace = Backtrace::new(); + + let mut stderr = io::stderr(); + + let _ = writeln!(stderr, ""); + let _ = writeln!(stderr, "===================="); + let _ = writeln!(stderr, ""); + let _ = writeln!(stderr, "{:?}", backtrace); + let _ = writeln!(stderr, ""); + let _ = writeln!( + stderr, + "Thread '{}' panicked at '{}', {}:{}", + name, msg, file, line + ); + + let _ = writeln!(stderr, "{}", ABOUT_PANIC); +} +