X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcommon%2Fquassel.cpp;h=d06aa28973b166ad5a87ffed3618957cb3ee1778;hb=167ef57a636052f8e18a206e84c3447552e84d2b;hp=f1d37c5c2d8d1150593295450327632bd1a32b8c;hpb=f12ff6555fc60d165d5057902a91cdff355816b9;p=quassel.git diff --git a/src/common/quassel.cpp b/src/common/quassel.cpp index f1d37c5c..d06aa289 100644 --- a/src/common/quassel.cpp +++ b/src/common/quassel.cpp @@ -34,7 +34,7 @@ #include "types.h" #include "syncableobject.h" -#if defined(HAVE_EXECINFO) and not defined(Q_OS_MAC) +#if defined(HAVE_EXECINFO) && !defined(Q_OS_MAC) # define BUILD_CRASHHANDLER # include # include @@ -46,6 +46,7 @@ CliParser *Quassel::_cliParser = 0; Quassel::RunMode Quassel::_runMode; bool Quassel::_initialized = false; bool Quassel::DEBUG = false; +QString Quassel::_coreDumpFileName; Quassel::Quassel() { Q_INIT_RESOURCE(i18n); @@ -58,7 +59,7 @@ Quassel::Quassel() { signal(SIGABRT, handleSignal); signal(SIGBUS, handleSignal); signal(SIGSEGV, handleSignal); -#endif // #if defined(HAVE_EXECINFO) and not defined(Q_OS_MAC) +#endif // #if defined(HAVE_EXECINFO) && !defined(Q_OS_MAC) _cliParser = new CliParser(); @@ -72,8 +73,10 @@ Quassel::~Quassel() { } bool Quassel::init() { - if(_initialized) return true; // allow multiple invocations because of MonolithicApplication + if(_initialized) + return true; // allow multiple invocations because of MonolithicApplication + _initialized = true; qsrand(QTime(0,0,0).secsTo(QTime::currentTime())); registerMetaTypes(); @@ -222,15 +225,33 @@ void Quassel::handleSignal(int sig) { } } +void Quassel::logFatalMessage(const char *msg) { +#ifndef Q_OS_MAC + QFile dumpFile(coreDumpFileName()); + dumpFile.open(QIODevice::WriteOnly); + QTextStream dumpStream(&dumpFile); +#else + QTextStream dumpStream(stderr); +#endif + + dumpStream << "Fatal: " << msg << '\n'; + dumpStream.flush(); + + qInstallMsgHandler(0); + abort(); +} + void Quassel::handleCrash() { #ifdef BUILD_CRASHHANDLER void* callstack[128]; int i, frames = backtrace(callstack, 128); - QFile dumpFile(QString("Quassel-Crash-%1").arg(QDateTime::currentDateTime().toString("yyyyMMdd-hhmm.log"))); - dumpFile.open(QIODevice::WriteOnly); + QFile dumpFile(coreDumpFileName()); + dumpFile.open(QIODevice::Append); QTextStream dumpStream(&dumpFile); + dumpStream << "Quassel IRC: " << _buildInfo.baseVersion << ' ' << _buildInfo.commitHash << '\n'; + for (i = 0; i < frames; ++i) { Dl_info info; dladdr (callstack[i], &info); @@ -285,3 +306,10 @@ void Quassel::handleCrash() { exit(27); #endif /* BUILD_CRASHHANDLER */ } + +const QString &Quassel::coreDumpFileName() { + if(_coreDumpFileName.isEmpty()) + _coreDumpFileName = QString("Quassel-Crash-%1.log").arg(QDateTime::currentDateTime().toString("yyyyMMdd-hhmm")); + + return _coreDumpFileName; +}