]> sigrok.org Git - pulseview.git/blobdiff - main.cpp
Add logging mechanism
[pulseview.git] / main.cpp
index 1e214e03f97df04c1f694b971ca25df0a36cc3eb..feff17aaf47cd54299ff114871e32247aceedce1 100644 (file)
--- a/main.cpp
+++ b/main.cpp
 #include "signalhandler.hpp"
 #endif
 
+#ifdef ENABLE_STACKTRACE
+#include <signal.h>
+#include <boost/stacktrace.hpp>
+#include <QStandardPaths>
+#endif
+
 #include "pv/application.hpp"
 #include "pv/devicemanager.hpp"
+#include "pv/globalsettings.hpp"
+#include "pv/logging.hpp"
 #include "pv/mainwindow.hpp"
 #include "pv/session.hpp"
+
 #ifdef ANDROID
 #include <libsigrokandroidutils/libsigrokandroidutils.h>
 #include "android/assetreader.hpp"
@@ -55,6 +64,17 @@ using std::exception;
 using std::shared_ptr;
 using std::string;
 
+#if ENABLE_STACKTRACE
+QString stacktrace_filename;
+
+void signal_handler(int signum)
+{
+       ::signal(signum, SIG_DFL);
+       boost::stacktrace::safe_dump_to(stacktrace_filename.toLocal8Bit().data());
+       ::raise(SIGABRT);
+}
+#endif
+
 void usage()
 {
        fprintf(stdout,
@@ -171,10 +191,26 @@ int main(int argc, char *argv[])
        if (argc - optind == 1)
                open_file = argv[argc - 1];
 
+       // Prepare the global settings since logging needs them early on
+       pv::GlobalSettings settings;
+       settings.set_defaults_where_needed();
+
+       pv::logging.init();
+
        // Initialise libsigrok
        context = sigrok::Context::create();
        pv::Session::sr_context = context;
 
+#if ENABLE_STACKTRACE
+       QString temp_path = QStandardPaths::standardLocations(
+               QStandardPaths::TempLocation).at(0);
+       stacktrace_filename = temp_path + "/pv_stacktrace.dmp";
+       qDebug() << "Stack trace file is" << stacktrace_filename;
+
+       ::signal(SIGSEGV, &signal_handler);
+       ::signal(SIGABRT, &signal_handler);
+#endif
+
 #ifdef ANDROID
        context->set_resource_reader(&asset_reader);
 #endif
@@ -191,44 +227,44 @@ int main(int argc, char *argv[])
                srd_decoder_load_all();
 #endif
 
+#ifndef ENABLE_STACKTRACE
                try {
-                       // Create the device manager, initialise the drivers
-                       pv::DeviceManager device_manager(context, driver, do_scan);
+#endif
+
+               // Create the device manager, initialise the drivers
+               pv::DeviceManager device_manager(context, driver, do_scan);
 
-                       // Initialise the main window
-                       pv::MainWindow w(device_manager);
-                       w.show();
+               // Initialise the main window
+               pv::MainWindow w(device_manager);
+               w.show();
 
-                       if (restore_sessions)
-                               w.restore_sessions();
+               if (restore_sessions)
+                       w.restore_sessions();
 
-                       if (!open_file.empty())
-                               w.add_session_with_file(open_file, open_file_format);
-                       else
-                               w.add_default_session();
+               if (!open_file.empty())
+                       w.add_session_with_file(open_file, open_file_format);
+               else
+                       w.add_default_session();
 
 #ifdef ENABLE_SIGNALS
-                       if (SignalHandler::prepare_signals()) {
-                               SignalHandler *const handler =
-                                       new SignalHandler(&w);
-                               QObject::connect(handler,
-                                       SIGNAL(int_received()),
-                                       &w, SLOT(close()));
-                               QObject::connect(handler,
-                                       SIGNAL(term_received()),
-                                       &w, SLOT(close()));
-                       } else {
-                               qWarning() <<
-                                       "Could not prepare signal handler.";
-                       }
+               if (SignalHandler::prepare_signals()) {
+                       SignalHandler *const handler = new SignalHandler(&w);
+                       QObject::connect(handler, SIGNAL(int_received()),
+                               &w, SLOT(close()));
+                       QObject::connect(handler, SIGNAL(term_received()),
+                               &w, SLOT(close()));
+               } else
+                       qWarning() << "Could not prepare signal handler.";
 #endif
 
-                       // Run the application
-                       ret = a.exec();
+               // Run the application
+               ret = a.exec();
 
+#ifndef ENABLE_STACKTRACE
                } catch (exception& e) {
-                       qDebug() << e.what();
+                       qDebug() << "Exception:" << e.what();
                }
+#endif
 
 #ifdef ENABLE_DECODE
                // Destroy libsigrokdecode