diff options
author | Teo Mrnjavac <teo@kde.org> | 2016-03-22 12:53:10 +0300 |
---|---|---|
committer | Teo Mrnjavac <teo@kde.org> | 2016-03-22 12:53:10 +0300 |
commit | bbbf1b51a9900a2a4a7a3c24797798c30b82530d (patch) | |
tree | aaf89b5413f17017fd9ef5310c00e8709b58813f | |
parent | b1d33d550ea716eed9aba9ab55ff4672ffa36871 (diff) |
Store Linux-specific information for the CR GUI as char* and int.
-rw-r--r-- | src/libcrashreporter-handler/Handler.cpp | 58 | ||||
-rw-r--r-- | src/libcrashreporter-handler/Handler.h | 21 |
2 files changed, 79 insertions, 0 deletions
diff --git a/src/libcrashreporter-handler/Handler.cpp b/src/libcrashreporter-handler/Handler.cpp index e04474b..0b90df8 100644 --- a/src/libcrashreporter-handler/Handler.cpp +++ b/src/libcrashreporter-handler/Handler.cpp @@ -143,16 +143,39 @@ LaunchUploader( const char* dump_dir, const char* minidump_id, void* context, bo if ( !s_active || strlen( crashReporter ) == 0 ) return false; + const char* applicationName = static_cast<Handler*>(context)->applicationName(); + if ( strlen( applicationName ) == 0 ) + return false; + const char* executablePath = static_cast<Handler*>(context)->executablePath(); + if ( strlen( executablePath ) == 0 ) + return false; + const char* applicationVersion = static_cast<Handler*>(context)->applicationVersion(); + if ( strlen( applicationVersion ) == 0 ) + return false; + pid_t pid = fork(); if ( pid == -1 ) // fork failed return false; if ( pid == 0 ) { // we are the fork +#ifdef Q_OS_LINUX + execl( crashReporter, + crashReporter, + path, + static_cast<Handler*>(context)->pid(), + static_cast<Handler*>(context)->signalNumber(), + applicationName, + executablePath, + applicationVersion, + static_cast<Handler*>(context)->threadId(), + (char*) 0 ); +#else execl( crashReporter, crashReporter, path, (char*) 0 ); +#endif // execl replaces this process, so no more code will be executed // unless it failed. If it failed, then we should return false. @@ -182,6 +205,9 @@ Handler::Handler( const QString& dumpFolderPath, bool active, const QString& cra #endif setCrashReporter( crashReporter ); +#ifdef Q_OS_LINUX + setApplicationData( qApp ); +#endif } @@ -221,6 +247,38 @@ Handler::setCrashReporter( const QString& crashReporter ) } +void +Handler::setApplicationData( const QCoreApplication* app ) +{ + m_pid = app->applicationPid(); + + char* cappname; + std::string sappname = app->applicationName().toStdString(); + cappname = new char[ sappname.size() + 1 ]; + strcpy( cappname, sappname.c_str() ); + m_applicationName = cappname; + qDebug() << "m_applicationName: " << m_applicationName; + + char* cepath; + std::string sepath = app->applicationName().toStdString(); + cepath = new char[ sepath.size() + 1 ]; + strcpy( cepath, sepath.c_str() ); + m_executablePath = cepath; + qDebug() << "m_executablePath: " << m_executablePath; + + char* cappver; + std::string sappver = app->applicationName().toStdString(); + cappver = new char[ sappver.size() + 1 ]; + strcpy( cappver, sappver.c_str() ); + m_applicationVersion = cappver; + qDebug() << "m_applicationVersion: " << m_applicationVersion; + + // To be set by the handler + m_signalNumber = -1; + m_threadId = -1; +} + + Handler::~Handler() { delete m_crash_handler; diff --git a/src/libcrashreporter-handler/Handler.h b/src/libcrashreporter-handler/Handler.h index 185700d..1b1d6c6 100644 --- a/src/libcrashreporter-handler/Handler.h +++ b/src/libcrashreporter-handler/Handler.h @@ -16,7 +16,10 @@ * along with Tomahawk. If not, see <http://www.gnu.org/licenses/>. */ +#include <QtGlobal> + class QString; +class QCoreApplication; namespace google_breakpad { @@ -30,6 +33,14 @@ class Handler { const char* m_crashReporterChar; // yes! It MUST be const char[] const wchar_t* m_crashReporterWChar; +#ifdef Q_OS_LINUX + int m_pid; + int m_signalNumber; + const char* m_applicationName; + const char* m_executablePath; + const char* m_applicationVersion; + int m_threadId; +#endif public: Handler(const QString& dumpFolderPath, bool active, const QString& crashReporter ); @@ -42,6 +53,16 @@ public: const char* crashReporterChar() const { return m_crashReporterChar; } const wchar_t* crashReporterWChar() const { return m_crashReporterWChar; } +#ifdef Q_OS_LINUX + void setApplicationData( const QCoreApplication* app ); + int pid() const { return m_pid; } + int signalNumber() const { return m_signalNumber; } + const char* applicationName() const { return m_applicationName; } + const char* executablePath() const { return m_executablePath; } + const char* applicationVersion() const { return m_applicationVersion; } + int threadId() const { return m_threadId; } +#endif + private: google_breakpad::ExceptionHandler* m_crash_handler; }; |