mirror of
https://github.com/KjellKod/g3log.git
synced 2025-03-04 19:13:31 +01:00
Bugfix: stackdump not called at the right place for failed contracts and LOG(FATAL)
This commit is contained in:
parent
c847ee037f
commit
74963e13f1
@ -36,7 +36,6 @@ namespace {
|
||||
void crashHandler(int signal_number, siginfo_t *info, void *unused_context) {
|
||||
using namespace g2::internal;
|
||||
|
||||
|
||||
std::ostringstream oss;
|
||||
oss << "Received fatal signal: " << g2::internal::signalName(signal_number);
|
||||
oss << "(" << signal_number << ")\tPID: " << getpid() << std::endl;
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include "g2logmessage.hpp"
|
||||
#include "g2log.hpp"
|
||||
#include "std2_make_unique.hpp"
|
||||
#include "crashhandler.hpp"
|
||||
#include <csignal>
|
||||
|
||||
#include <iostream>
|
||||
@ -22,11 +23,15 @@ namespace g2 {
|
||||
const std::string& function, const LEVELS& level)
|
||||
: _message(std2::make_unique<LogMessage>(file, line, function, level)) {
|
||||
|
||||
if (_message.get()->wasFatal()) {
|
||||
addStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
LogMessageBuilder::~LogMessageBuilder() {
|
||||
_message.get()->write().append(stream().str());
|
||||
if (_message.get()->wasFatal()) {
|
||||
_message.get()->write().append(_stackTrace); // empty or not
|
||||
FatalMessageBuilder trigger(_message, SIGABRT);
|
||||
return; // FatalMessageBuilder will send to worker at scope exit
|
||||
}
|
||||
@ -35,10 +40,17 @@ namespace g2 {
|
||||
}
|
||||
|
||||
LogMessageBuilder& LogMessageBuilder::setExpression(const std::string& boolean_expression) {
|
||||
_message.get()->setExpression(boolean_expression);
|
||||
_message.get()->setExpression(boolean_expression);
|
||||
return *this;
|
||||
}
|
||||
|
||||
LogMessageBuilder& LogMessageBuilder::addStackTrace() {
|
||||
_stackTrace = {"\n*******\tSTACKDUMP *******\n"};
|
||||
_stackTrace.append(internal::stackdump());
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
||||
std::ostringstream& LogMessageBuilder::stream() {
|
||||
return _stream;
|
||||
}
|
||||
|
@ -30,6 +30,8 @@ namespace g2 {
|
||||
virtual ~LogMessageBuilder();
|
||||
|
||||
LogMessageBuilder& setExpression(const std::string& boolean_expression);
|
||||
LogMessageBuilder& addStackTrace();
|
||||
|
||||
std::ostringstream& stream();
|
||||
|
||||
|
||||
@ -44,5 +46,6 @@ namespace g2 {
|
||||
private:
|
||||
LogMessagePtr _message;
|
||||
std::ostringstream _stream;
|
||||
std::string _stackTrace;
|
||||
};
|
||||
} // g2
|
||||
|
@ -97,7 +97,7 @@ void changeFatalInitHandlerForUnitTesting(std::function<void(FatalMessagePtr) >
|
||||
|
||||
|
||||
#define INTERNAL_CONTRACT_MESSAGE(boolean_expression) \
|
||||
g2::LogMessageBuilder(__FILE__, __LINE__, __PRETTY_FUNCTION__, g2::internal::CONTRACT).setExpression(boolean_expression)
|
||||
g2::LogMessageBuilder(__FILE__, __LINE__, __PRETTY_FUNCTION__, g2::internal::CONTRACT).setExpression(boolean_expression).addStackTrace()
|
||||
|
||||
|
||||
// LOG(level) is the API for the stream log
|
||||
|
@ -61,11 +61,9 @@ namespace g2 {
|
||||
if (FATAL.value == level_value) {
|
||||
oss << "\n\t*******\tEXIT trigger caused by LOG(FATAL) entry: \n\t";
|
||||
oss << '"' << message() << '"';
|
||||
oss << "\n*******\tSTACKDUMP *******\n" << internal::stackdump();
|
||||
} else if (internal::CONTRACT.value == level_value) {
|
||||
oss << "\n\t *******\tEXIT trigger caused by broken Contract: CHECK(" << _expression << ")\n\t";
|
||||
oss << '"' << message() << '"';
|
||||
oss << "\n*******\tSTACKDUMP *******\n" << internal::stackdump() << '"';
|
||||
} else {
|
||||
oss << "\n\t*******\tUNKNOWN Log Message Type\n" << '"' << message() << '"';
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user