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:
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user