Bugfix: stackdump not called at the right place for failed contracts and LOG(FATAL)

This commit is contained in:
KjellKod 2013-12-19 22:55:10 -07:00
parent c847ee037f
commit 74963e13f1
5 changed files with 17 additions and 5 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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() << '"';
}