From 930ff968ee78f3a0169f40e9aa59ad062ae43dec Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Fri, 19 Sep 2014 10:40:43 +0200
Subject: [PATCH] Further experimenting in Crash Handler

---
 GUI/coregui/CMakeLists.txt           |  4 ++
 GUI/coregui/Views/SimulationView.cpp |  3 ++
 GUI/crashhandler/main.cpp            | 72 ++++++++++++++--------------
 GUI/main/CMakeLists.txt              |  4 +-
 GUI/main/main.cpp                    | 20 ++++----
 5 files changed, 55 insertions(+), 48 deletions(-)

diff --git a/GUI/coregui/CMakeLists.txt b/GUI/coregui/CMakeLists.txt
index 6b926a36d6f..ef9c8ab5632 100644
--- a/GUI/coregui/CMakeLists.txt
+++ b/GUI/coregui/CMakeLists.txt
@@ -12,6 +12,10 @@ endif()
 
 set(library_name BornAgainGUI)
 
+if(BORNAGAIN_CRASHHADLER)
+    add_definitions(-DBORNAGAIN_CRASHHANDLER)
+endif()
+
 # --- source and include files ---
 set(include_dirs
     ${CMAKE_CURRENT_SOURCE_DIR}/mainwindow
diff --git a/GUI/coregui/Views/SimulationView.cpp b/GUI/coregui/Views/SimulationView.cpp
index 1e3b8963e06..79d95811421 100644
--- a/GUI/coregui/Views/SimulationView.cpp
+++ b/GUI/coregui/Views/SimulationView.cpp
@@ -50,7 +50,10 @@ void SimulationView::updateSimulationViewElements()
 {
     m_simulationSetupWidget->updateViewElements();
 //    m_quickSimulationWidget->updateViews(m_simulationSetupWidget->getInstrumentSelection(), m_simulationSetupWidget->getSampleSelection());
+#ifdef BORNAGAIN_CRASHHANDLER
+    // Intentional memory corruption to make application crashing
     delete reinterpret_cast<QString*>(0xFEE1DEAD);
+#endif
 }
 
 void SimulationView::onChangeTabWidget(int index)
diff --git a/GUI/crashhandler/main.cpp b/GUI/crashhandler/main.cpp
index 62ae1c0a737..f1ea08bac45 100644
--- a/GUI/crashhandler/main.cpp
+++ b/GUI/crashhandler/main.cpp
@@ -30,20 +30,20 @@
 
 
 
-//#include "crashhandler.h"
-//#include "utils.h"
+#include "crashhandler.h"
+#include "utils.h"
 
-//#include <QApplication>
-//#include <QFile>
-//#include <QProcess>
-//#include <QString>
-//#include <QStyle>
-//#include <QTextStream>
-//#include <QDebug>
+#include <QApplication>
+#include <QFile>
+#include <QProcess>
+#include <QString>
+#include <QStyle>
+#include <QTextStream>
+#include <QDebug>
 
-//#include <stdlib.h>
-//#include <sys/types.h>
-//#include <unistd.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <unistd.h>
 
 
 #include <iostream>
@@ -53,30 +53,30 @@
 // Usage: $0 <name of signal causing the crash>
 int main(int argc, char *argv[])
 {
-//    QApplication app(argc, argv);
-//    app.setApplicationName(QLatin1String(APPLICATION_NAME));
-//    app.setWindowIcon(QApplication::style()->standardIcon(QStyle::SP_MessageBoxCritical));
-
-//    // Check usage.
-//    Q_PID parentPid = getppid();
-//    QString parentExecutable = QFile::symLinkTarget(QString::fromLatin1("/proc/%1/exe")
-//        .arg(QString::number(parentPid)));
-
-//    //if (argc > 2 || !parentExecutable.contains(QLatin1String("qtcreator"))) {
-//    if (argc > 2 ) {
-//        QTextStream err(stderr);
-//        err << QString::fromLatin1("This crash handler will be called by Qt Creator itself. "
-//                                   "Do not call this manually.\n");
-//        return EXIT_FAILURE;
-//    }
-
-//    // Run.
-//    CrashHandler *crashHandler = new CrashHandler(parentPid, app.arguments().at(1));
-//    crashHandler->run();
-
-//    return app.exec();
-
-    std::cout << "crashhandler::main() -> Hello World!" << std::endl;
+    QApplication app(argc, argv);
+    app.setApplicationName(QLatin1String(APPLICATION_NAME));
+    app.setWindowIcon(QApplication::style()->standardIcon(QStyle::SP_MessageBoxCritical));
+
+    // Check usage.
+    Q_PID parentPid = getppid();
+    QString parentExecutable = QFile::symLinkTarget(QString::fromLatin1("/proc/%1/exe")
+        .arg(QString::number(parentPid)));
+
+    //if (argc > 2 || !parentExecutable.contains(QLatin1String("qtcreator"))) {
+    if (argc > 2 ) {
+        QTextStream err(stderr);
+        err << QString::fromLatin1("This crash handler will be called by Qt Creator itself. "
+                                   "Do not call this manually.\n");
+        return EXIT_FAILURE;
+    }
+
+    // Run.
+    CrashHandler *crashHandler = new CrashHandler(parentPid, app.arguments().at(1));
+    crashHandler->run();
+
+    return app.exec();
+
+//    std::cout << "crashhandler::main() -> Hello World!" << std::endl;
     return 0;
 }
 
diff --git a/GUI/main/CMakeLists.txt b/GUI/main/CMakeLists.txt
index 286c10fe8f4..776f57ba366 100644
--- a/GUI/main/CMakeLists.txt
+++ b/GUI/main/CMakeLists.txt
@@ -26,8 +26,8 @@ set(include_files)
     message("XXXXX ${BORNAGAIN_CRASHHADLER}")
 
 if(BORNAGAIN_CRASHHADLER)
-#    list(APPEND source_files crashhandlersetup.cpp stacktracesetup.cpp)
-#    list(APPEND include_files crashhandlersetup.h stacktracesetup.h)
+    list(APPEND source_files crashhandlersetup.cpp stacktracesetup.cpp)
+    list(APPEND include_files crashhandlersetup.h stacktracesetup.h)
     list(APPEND source_files stacktracesetup.cpp)
     list(APPEND include_files stacktracesetup.h)
 endif()
diff --git a/GUI/main/main.cpp b/GUI/main/main.cpp
index 50158d08dec..241ce243809 100644
--- a/GUI/main/main.cpp
+++ b/GUI/main/main.cpp
@@ -1,4 +1,4 @@
-//#include "crashhandlersetup.h"
+#include "crashhandlersetup.h"
 #include "mainwindow.h"
 #include "stacktracesetup.h"
 #include <QApplication>
@@ -12,26 +12,26 @@ int main(int argc, char *argv[])
 
 
 
-//    setupCrashHandler();
+    setupCrashHandler();
 
 
     MainWindow w;
     w.show();
 
-#ifdef BORNAGAIN_CRASHHANDLER
-    std::cout << "BORNAGAIN_CRASHHANDLER" << std::endl;
-    StackTraceSetup s;
-#endif
+//#ifdef BORNAGAIN_CRASHHANDLER
+//    std::cout << "BORNAGAIN_CRASHHANDLER" << std::endl;
+//    StackTraceSetup s;
+//#endif
 
 //    QVector<double> vector;
 //    double d = vector[0]+0.1;
 //    qDebug() << "main double:" << d;
 
 
-    return a.exec();
+//    return a.exec();
 
-//    const int r = a.exec();
+    const int r = a.exec();
 
-//    cleanupCrashHandler();
-//    return r;
+    cleanupCrashHandler();
+    return r;
 }
-- 
GitLab