mirror of
https://github.com/KjellKod/g3log.git
synced 2024-12-14 02:57:46 +01:00
commit
2a0b05421d
@ -52,7 +52,7 @@ ELSEIF("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
||||
set(CMAKE_CXX_FLAGS "-Wall -Wunused -std=c++11 -pthread -D_GLIBCXX_USE_NANOSLEEP -D_GLIBCXX_USE_SCHED_YIELD")
|
||||
ELSE()
|
||||
set(PLATFORM_LINK_LIBRIES rt)
|
||||
set(CMAKE_CXX_FLAGS "-Wall -rdynamic -Wunused -std=c++11 -pthread -D_GLIBCXX_USE_NANOSLEEP -D_GLIBCXX_USE_SCHED_YIELD")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -rdynamic -Wunused -std=c++11 -pthread -D_GLIBCXX_USE_NANOSLEEP -D_GLIBCXX_USE_SCHED_YIELD")
|
||||
ENDIF()
|
||||
ENDIF()
|
||||
|
||||
|
@ -157,7 +157,7 @@ namespace g3 {
|
||||
const size_t max_dump_size = 50;
|
||||
void* dump[max_dump_size];
|
||||
size_t size = backtrace(dump, max_dump_size);
|
||||
char** messages = backtrace_symbols(dump, size); // overwrite sigaction with caller's address
|
||||
char** messages = backtrace_symbols(dump, static_cast<int>(size)); // overwrite sigaction with caller's address
|
||||
|
||||
// dump stack: skip first frame, since that is here
|
||||
std::ostringstream oss;
|
||||
|
@ -31,7 +31,8 @@
|
||||
#include <iostream>
|
||||
#include <thread>
|
||||
#include <atomic>
|
||||
|
||||
#include <cstdlib>
|
||||
#include <sstream>
|
||||
|
||||
namespace {
|
||||
std::once_flag g_initialize_flag;
|
||||
@ -63,8 +64,15 @@ namespace g3 {
|
||||
installCrashHandler();
|
||||
});
|
||||
std::lock_guard<std::mutex> lock(g_logging_init_mutex);
|
||||
CHECK(!internal::isLoggingInitialized());
|
||||
CHECK(bgworker != nullptr);
|
||||
if (internal::isLoggingInitialized() || nullptr == bgworker) {
|
||||
std::ostringstream exitMsg;
|
||||
exitMsg << __FILE__ "->" << __FUNCTION__ << ":" << __LINE__ << std::endl;
|
||||
exitMsg << "\tFatal exit due to illegal initialization of g3::LogWorker\n";
|
||||
exitMsg << "\t(due to multiple initializations? : " << std::boolalpha << internal::isLoggingInitialized();
|
||||
exitMsg << ", due to nullptr == bgworker? : " << std::boolalpha << (nullptr == bgworker) << ")";
|
||||
std::cerr << exitMsg.str() << std::endl;
|
||||
std::exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
// Save the first uninitialized message, if any
|
||||
std::call_once(g_save_first_unintialized_flag, [&bgworker] {
|
||||
|
@ -52,9 +52,9 @@ namespace g3 {
|
||||
std::string exiting = {"Fatal type: "};
|
||||
|
||||
uniqueMsg->write().append("). ").append(exiting).append(" ").append(reason)
|
||||
.append("\nLog content flushed flushed sucessfully to sink\n\n");
|
||||
.append("\nLog content flushed sucessfully to sink\n\n");
|
||||
|
||||
std::cerr << uniqueMsg->message() << std::flush;
|
||||
std::cerr << uniqueMsg->toString() << std::flush;
|
||||
for (auto& sink : _sinks) {
|
||||
LogMessage msg(*(uniqueMsg));
|
||||
sink->send(LogMessageMover(std::move(msg)));
|
||||
|
@ -23,6 +23,8 @@
|
||||
#include <mutex>
|
||||
#include <g3log/g3log.hpp>
|
||||
|
||||
#pragma comment(lib, "dbghelp.lib")
|
||||
|
||||
|
||||
#if !(defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
|
||||
#error "stacktrace_win.cpp used but not on a windows system"
|
||||
|
@ -321,27 +321,48 @@ TEST(LogTest, FatalSIGTERM__UsingDefaultHandler) {
|
||||
EXPECT_EQ(g_fatal_counter.load(), size_t{1});
|
||||
}
|
||||
|
||||
#if !(defined(WIN32) || defined(_WIN32) || defined(__WIN32__))
|
||||
namespace {
|
||||
std::atomic<size_t> customFatalCounter = {0};
|
||||
std::atomic<int> lastEncounteredSignal = {0};
|
||||
void customSignalHandler(int signal_number, siginfo_t* info, void* unused_context) {
|
||||
lastEncounteredSignal.store(signal_number);
|
||||
++customFatalCounter;
|
||||
++customFatalCounter;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void installCustomSIGTERM () {
|
||||
void installCustomSIGTERM() {
|
||||
struct sigaction action;
|
||||
memset(&action, 0, sizeof (action));
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_sigaction = &customSignalHandler;
|
||||
action.sa_flags = SA_SIGINFO;
|
||||
sigaction(SIGTERM, &action, nullptr);
|
||||
memset(&action, 0, sizeof(action));
|
||||
sigemptyset(&action.sa_mask);
|
||||
action.sa_sigaction = &customSignalHandler;
|
||||
action.sa_flags = SA_SIGINFO;
|
||||
sigaction(SIGTERM, &action, nullptr);
|
||||
}
|
||||
|
||||
} // anonymous
|
||||
|
||||
// Override of signal handling and testing of it should be fairly easy to port to windows
|
||||
// ref: https://github.com/KjellKod/g3log/blob/master/src/crashhandler_windows.cpp
|
||||
// what is missing is the override of signals and custom installation of signals
|
||||
// ref: https://github.com/KjellKod/g3log/blob/master/src/crashhandler_unix.cpp
|
||||
// functions: void restoreSignalHandlerToDefault()
|
||||
// void overrideSetupSignals(const std::map<int, std::string> overrideSignals)
|
||||
// void restoreSignalHandler(int signal_number)
|
||||
//
|
||||
// It would require some adding of unit test (see the test below)
|
||||
// and good Windows experience. Since I am not currently working much on the Windows
|
||||
// side I am reaching out to the community for this one:
|
||||
//
|
||||
//
|
||||
// For the test to work the following code should be added in this test
|
||||
//void customSignalHandler(int signal_number) {
|
||||
// lastEncounteredSignal.store(signal_number);
|
||||
// ++customFatalCounter;
|
||||
//}
|
||||
//
|
||||
//void installCustomSIGTERM() {
|
||||
// ASSERT_TRUE(SIG_ERR != signal(SIGTERM, customSignalHandler));
|
||||
//}
|
||||
|
||||
|
||||
TEST(LogTest, FatalSIGTERM__UsingCustomHandler) {
|
||||
RestoreFileLogger logger(log_directory);
|
||||
g_fatal_counter.store(0);
|
||||
@ -360,6 +381,7 @@ TEST(LogTest, FatalSIGTERM__UsingCustomHandler) {
|
||||
EXPECT_EQ(lastEncounteredSignal.load(), SIGTERM);
|
||||
EXPECT_EQ(customFatalCounter.load(), size_t{1});
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user