Merge pull request 'Flush logs on crash' (#25) from flush_logs_on_crash into master

Reviewed-on: https://git.madvoxel.net/OpenVulkano/OpenVulkano/pulls/25
Reviewed-by: Georg Hagen <georg.hagen@madvoxel.com>
This commit is contained in:
Vladyslav_Baranovskyi_EXT
2024-05-30 13:31:21 +02:00

View File

@@ -9,6 +9,7 @@
#include "IO/AppFolders.hpp" #include "IO/AppFolders.hpp"
#include <iostream> #include <iostream>
#include <filesystem> #include <filesystem>
#include <csignal>
#include <spdlog/sinks/rotating_file_sink.h> #include <spdlog/sinks/rotating_file_sink.h>
#include <spdlog/sinks/null_sink.h> #include <spdlog/sinks/null_sink.h>
#ifndef NO_CONSOLE_LOG #ifndef NO_CONSOLE_LOG
@@ -17,6 +18,11 @@
#ifdef _MSC_VER #ifdef _MSC_VER
#include <spdlog/sinks/msvc_sink.h> #include <spdlog/sinks/msvc_sink.h>
#endif #endif
#ifdef _WIN32
# include <windows.h>
# include <dbghelp.h>
#endif
namespace OpenVulkano namespace OpenVulkano
{ {
@@ -39,6 +45,45 @@ namespace OpenVulkano
Logger::Ptr Logger::PERF = nullptr; Logger::Ptr Logger::PERF = nullptr;
Logger::Ptr Logger::APP = nullptr; Logger::Ptr Logger::APP = nullptr;
namespace
{
bool didLoggerShutdown = false;
void signalHandler(int sigCode)
{
if(!didLoggerShutdown)
spdlog::error("Received signal {}", sigCode);
spdlog::shutdown();
didLoggerShutdown = true;
std::raise(sigCode); // calls default handler
}
#ifdef _WIN32
LONG WINAPI win32ExceptionHandler(EXCEPTION_POINTERS *exceptionPointers)
{
// NOTE(vb): We can report some of the exceptionPointers fields to the user... But this is for windows only
if(!didLoggerShutdown)
spdlog::error("An exception occured");
spdlog::shutdown();
didLoggerShutdown = true;
return EXCEPTION_CONTINUE_SEARCH;
}
#endif
void setupSignalHandlers()
{
std::signal(SIGSEGV, signalHandler);
std::signal(SIGABRT, signalHandler);
std::signal(SIGFPE, signalHandler);
std::signal(SIGILL, signalHandler);
// std::signal(SIGINT, signalHandler);
std::signal(SIGTERM, signalHandler);
#ifdef _WIN32
SetUnhandledExceptionFilter(win32ExceptionHandler);
#endif
}
}
void Logger::SetupLogger(std::string logFolder, const std::string& logFile) void Logger::SetupLogger(std::string logFolder, const std::string& logFile)
{ {
if (logFolder.empty()) logFolder = (AppFolders::GetAppDataHomeDir() / "logs").string(); if (logFolder.empty()) logFolder = (AppFolders::GetAppDataHomeDir() / "logs").string();
@@ -77,6 +122,8 @@ namespace OpenVulkano
spdlog::flush_every(std::chrono::seconds(5)); spdlog::flush_every(std::chrono::seconds(5));
setupSignalHandlers();
MANAGER->info("Logger initialized"); MANAGER->info("Logger initialized");
} }
catch (const spdlog::spdlog_ex& e) catch (const spdlog::spdlog_ex& e)