Skip to content
Snippets Groups Projects
Commit bd09fe1a authored by BlackDex's avatar BlackDex
Browse files

Updated code so backtraces are logged also.

parent bcbe6177
No related branches found
No related tags found
No related merge requests found
...@@ -119,6 +119,7 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" ...@@ -119,6 +119,7 @@ checksum = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693"
name = "bitwarden_rs" name = "bitwarden_rs"
version = "1.0.0" version = "1.0.0"
dependencies = [ dependencies = [
"backtrace",
"chashmap", "chashmap",
"chrono", "chrono",
"data-encoding", "data-encoding",
......
...@@ -118,6 +118,9 @@ idna = "0.2.0" ...@@ -118,6 +118,9 @@ idna = "0.2.0"
# CLI argument parsing # CLI argument parsing
structopt = "0.3.11" structopt = "0.3.11"
# Logging panics to logfile instead stderr only
backtrace = "0.3.45"
[patch.crates-io] [patch.crates-io]
# Use newest ring # Use newest ring
rocket = { git = 'https://github.com/SergioBenitez/Rocket', rev = 'b95b6765e1cc8be7c1e7eaef8a9d9ad940b0ac13' } rocket = { git = 'https://github.com/SergioBenitez/Rocket', rev = 'b95b6765e1cc8be7c1e7eaef8a9d9ad940b0ac13' }
......
...@@ -20,12 +20,14 @@ extern crate derive_more; ...@@ -20,12 +20,14 @@ extern crate derive_more;
#[macro_use] #[macro_use]
extern crate num_derive; extern crate num_derive;
extern crate backtrace;
use std::{ use std::{
fs::create_dir_all, fs::create_dir_all,
path::Path, path::Path,
process::{exit, Command}, process::{exit, Command},
str::FromStr, str::FromStr,
panic, panic, thread, fmt // For panic logging
}; };
#[macro_use] #[macro_use]
...@@ -43,6 +45,16 @@ pub use error::{Error, MapResult}; ...@@ -43,6 +45,16 @@ pub use error::{Error, MapResult};
use structopt::StructOpt; use structopt::StructOpt;
// Used for catching panics and log them to file instead of stderr
use backtrace::Backtrace;
struct Shim(Backtrace);
impl fmt::Debug for Shim {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
write!(fmt, "\n{:?}", self.0)
}
}
#[derive(Debug, StructOpt)] #[derive(Debug, StructOpt)]
#[structopt(name = "bitwarden_rs", about = "A Bitwarden API server written in Rust")] #[structopt(name = "bitwarden_rs", about = "A Bitwarden API server written in Rust")]
struct Opt { struct Opt {
...@@ -145,7 +157,40 @@ fn init_logging(level: log::LevelFilter) -> Result<(), fern::InitError> { ...@@ -145,7 +157,40 @@ fn init_logging(level: log::LevelFilter) -> Result<(), fern::InitError> {
// Catch panics and log them instead of default output to StdErr // Catch panics and log them instead of default output to StdErr
panic::set_hook(Box::new(|info| { panic::set_hook(Box::new(|info| {
warn!("[PANIC] {}", info); let backtrace = Backtrace::new();
let thread = thread::current();
let thread = thread.name().unwrap_or("unnamed");
let msg = match info.payload().downcast_ref::<&'static str>() {
Some(s) => *s,
None => match info.payload().downcast_ref::<String>() {
Some(s) => &**s,
None => "Box<Any>",
},
};
match info.location() {
Some(location) => {
error!(
target: "panic", "thread '{}' panicked at '{}': {}:{}{:?}",
thread,
msg,
location.file(),
location.line(),
Shim(backtrace)
);
}
None => {
error!(
target: "panic",
"thread '{}' panicked at '{}'{:?}",
thread,
msg,
Shim(backtrace)
)
}
}
})); }));
Ok(()) Ok(())
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment