summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDominik Holland <dominik.holland@qt.io>2020-02-21 11:25:27 +0100
committerDominik Holland <dominik.holland@qt.io>2020-02-22 09:46:21 +0000
commit3059fc20afaefea7f7b265e35bf96ea0037929d8 (patch)
tree19013d03c563dcb866bceb2b7d6ee30d7ed1b00b
parentd3112e5d2281a9a8d77b7ca1c7dfc0d25cb88143 (diff)
Enable libbacktrace support for macos
Similar to windows, we always want to provide a good stacktrace on mac and enable the libbacktrace support for release binaries as well. Change-Id: I1f7585c749505035e55fd44e088340a493b265d9 Reviewed-by: Robert Griebl <robert.griebl@qt.io>
-rw-r--r--3rdparty/libbacktrace/libbacktrace.pro6
-rw-r--r--application-manager.pro2
-rw-r--r--qmake-features/am-config.prf2
-rw-r--r--src/common-lib/crashhandler.cpp12
4 files changed, 17 insertions, 5 deletions
diff --git a/3rdparty/libbacktrace/libbacktrace.pro b/3rdparty/libbacktrace/libbacktrace.pro
index 8fbab208..ff3da892 100644
--- a/3rdparty/libbacktrace/libbacktrace.pro
+++ b/3rdparty/libbacktrace/libbacktrace.pro
@@ -1,4 +1,4 @@
-requires(linux)
+requires(linux|macos)
TEMPLATE = lib
TARGET = qtbacktrace
@@ -30,10 +30,12 @@ DEFINES *= _GNU_SOURCE
INCLUDEPATH += $$PWD/auxincl $$PWD/libbacktrace
+linux: SOURCES += libbacktrace/elf.c
+macos: SOURCES += libbacktrace/macho.c
+
SOURCES += \
libbacktrace/backtrace.c \
libbacktrace/simple.c \
- libbacktrace/elf.c \
libbacktrace/dwarf.c \
libbacktrace/mmapio.c \
libbacktrace/mmap.c \
diff --git a/application-manager.pro b/application-manager.pro
index db3ac898..df3ea34e 100644
--- a/application-manager.pro
+++ b/application-manager.pro
@@ -45,7 +45,7 @@ if(linux|force-libcrypto) {
else:SUBDIRS += 3rdparty/libarchive/libarchive.pro
}
-linux:!android:!disable-libbacktrace:if(enable-libbacktrace|CONFIG(debug, debug|release)) {
+!disable-libbacktrace:if(linux:!android:if(enable-libbacktrace|CONFIG(debug, debug|release))|macos) {
check_libbacktrace = "yes"
SUBDIRS += 3rdparty/libbacktrace/libbacktrace.pro
} else {
diff --git a/qmake-features/am-config.prf b/qmake-features/am-config.prf
index 01a98102..44622f3f 100644
--- a/qmake-features/am-config.prf
+++ b/qmake-features/am-config.prf
@@ -19,7 +19,7 @@ systemd-workaround:DEFINES *= AM_SYSTEMD_WORKAROUND
headless:DEFINES *= AM_HEADLESS
enable-widgets:DEFINES *= AM_ENABLE_WIDGETS
config_touchemulation:DEFINES += AM_ENABLE_TOUCH_EMULATION
-linux:!android:!disable-libbacktrace:if(enable-libbacktrace|CONFIG(debug, debug|release)):DEFINES *= AM_USE_LIBBACKTRACE
+!disable-libbacktrace:if(linux:!android:if(enable-libbacktrace|CONFIG(debug, debug|release))|macos): DEFINES *= AM_USE_LIBBACKTRACE
windows:msvc:!disable-stackwalker: DEFINES *= AM_USE_STACKWALKER
!force-single-process {
diff --git a/src/common-lib/crashhandler.cpp b/src/common-lib/crashhandler.cpp
index dbbaecd4..dd4ad89f 100644
--- a/src/common-lib/crashhandler.cpp
+++ b/src/common-lib/crashhandler.cpp
@@ -306,6 +306,8 @@ QT_END_NAMESPACE_AM
# endif
# if defined(Q_OS_LINUX)
# include <dlfcn.h>
+# elif defined(Q_OS_MACOS)
+# include <mach-o/dyld.h>
# endif
# include "unixsignalhandler.h"
@@ -454,7 +456,15 @@ static void logCrashInfo(LogToDestination logTo, const char *why, int stackFrame
return 0;
};
- struct backtrace_state *state = backtrace_create_state(nullptr, BACKTRACE_SUPPORTS_THREADS,
+ char *executable_path = nullptr;
+# if defined(Q_OS_MACOS)
+ char executable_path_buf[1024];
+ uint32_t executable_path_buf_len = sizeof(executable_path_buf);
+ if (_NSGetExecutablePath(executable_path_buf, &executable_path_buf_len) == 0)
+ executable_path = executable_path_buf;
+# endif
+
+ struct backtrace_state *state = backtrace_create_state(executable_path, BACKTRACE_SUPPORTS_THREADS,
errorCallback, nullptr);
logMsg(logTo, "\n > C++ backtrace:");