X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fquassel.cpp;h=d06aa28973b166ad5a87ffed3618957cb3ee1778;hp=88b87c246f8524720d4682034a55818ce68022d2;hb=3c635083917c68f15c10ec56c4a6a9d01a2593f9;hpb=480eab8daec4fb56a6886918c6a913cc197330f1 diff --git a/src/common/quassel.cpp b/src/common/quassel.cpp index 88b87c24..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(); @@ -170,7 +173,8 @@ void Quassel::setupBuildInfo(const QString &generated) { _buildInfo.plainVersionString = QString("v%1 (dist-%2)") .arg(_buildInfo.baseVersion) .arg(_buildInfo.commitHash.left(7)); - _buildInfo.fancyVersionString = QString("v%1 (dist-%2)") + _buildInfo.fancyVersionString + = QString("v%1 (dist-%2)") .arg(_buildInfo.baseVersion) .arg(_buildInfo.commitHash.left(7)) .arg(_buildInfo.commitHash); @@ -187,7 +191,7 @@ void Quassel::setupBuildInfo(const QString &generated) { .arg(rx.cap(1), distance, rx.cap(3)) .arg(_buildInfo.isSourceDirty ? "*" : ""); if(!_buildInfo.commitHash.isEmpty()) { - _buildInfo.fancyVersionString = QString("v%1%2 (git-%3%4)") + _buildInfo.fancyVersionString = QString("v%1%2 (git-%3%4)") .arg(rx.cap(1), distance, rx.cap(3)) .arg(_buildInfo.isSourceDirty ? "*" : "") .arg(_buildInfo.commitHash); @@ -221,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); @@ -284,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; +}