X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fquassel.cpp;h=d06aa28973b166ad5a87ffed3618957cb3ee1778;hp=dd6c5e7047d81231e78cdc8e9ab32af02c5754f4;hb=fe73542fbcd2129069890ffe107639eaf26b1066;hpb=84afdd46cb8ebfe821825efcf997a2041e513f71 diff --git a/src/common/quassel.cpp b/src/common/quassel.cpp index dd6c5e70..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(); @@ -224,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); @@ -287,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; +}