Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/dschmidt/libcrashreporter-qt.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeo Mrnjavac <teo@kde.org>2016-03-22 12:53:10 +0300
committerTeo Mrnjavac <teo@kde.org>2016-03-22 12:53:10 +0300
commitbbbf1b51a9900a2a4a7a3c24797798c30b82530d (patch)
treeaaf89b5413f17017fd9ef5310c00e8709b58813f
parentb1d33d550ea716eed9aba9ab55ff4672ffa36871 (diff)
Store Linux-specific information for the CR GUI as char* and int.
-rw-r--r--src/libcrashreporter-handler/Handler.cpp58
-rw-r--r--src/libcrashreporter-handler/Handler.h21
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;
};