Save crash logs to disk
This commit is contained in:
parent
953e10b42b
commit
f4438e32e0
41
src/main.rs
41
src/main.rs
|
@ -1,7 +1,7 @@
|
||||||
// hide console in release mode
|
// hide console in release mode
|
||||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||||
|
|
||||||
use std::{path::PathBuf, process};
|
use std::{path::PathBuf, process, time::SystemTime};
|
||||||
|
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use app::Application;
|
use app::Application;
|
||||||
|
@ -24,6 +24,43 @@ struct Args {
|
||||||
rom: Option<PathBuf>,
|
rom: Option<PathBuf>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn set_panic_handler() {
|
||||||
|
std::panic::set_hook(Box::new(|info| {
|
||||||
|
let mut message = String::new();
|
||||||
|
if let Some(msg) = info.payload().downcast_ref::<&str>() {
|
||||||
|
message += &format!("{}\n", msg);
|
||||||
|
} else if let Some(msg) = info.payload().downcast_ref::<String>() {
|
||||||
|
message += &format!("{}\n", msg);
|
||||||
|
}
|
||||||
|
if let Some(location) = info.location() {
|
||||||
|
message += &format!(
|
||||||
|
" in file '{}' at line {}\n",
|
||||||
|
location.file(),
|
||||||
|
location.line()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
let backtrace = std::backtrace::Backtrace::force_capture();
|
||||||
|
message += &format!("stack trace:\n{:#}\n", backtrace);
|
||||||
|
|
||||||
|
eprint!("{}", message);
|
||||||
|
|
||||||
|
let Some(project_dirs) = directories::ProjectDirs::from("com", "virtual-boy", "Lemur")
|
||||||
|
else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
let data_dir = project_dirs.data_dir();
|
||||||
|
if std::fs::create_dir_all(data_dir).is_err() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let timestamp = SystemTime::now()
|
||||||
|
.duration_since(SystemTime::UNIX_EPOCH)
|
||||||
|
.unwrap()
|
||||||
|
.as_millis();
|
||||||
|
let logfile_name = format!("crash-{}.txt", timestamp);
|
||||||
|
let _ = std::fs::write(data_dir.join(logfile_name), message);
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
fn set_process_priority_to_high() -> Result<()> {
|
fn set_process_priority_to_high() -> Result<()> {
|
||||||
use windows::Win32::{Foundation, System::Threading};
|
use windows::Win32::{Foundation, System::Threading};
|
||||||
|
@ -34,6 +71,8 @@ fn set_process_priority_to_high() -> Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
|
set_panic_handler();
|
||||||
|
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
set_process_priority_to_high()?;
|
set_process_priority_to_high()?;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue