diff options
author | Dominik Holland <dominik.holland@qt.io> | 2020-02-21 11:25:27 +0100 |
---|---|---|
committer | Dominik Holland <dominik.holland@qt.io> | 2020-02-22 09:46:21 +0000 |
commit | 3059fc20afaefea7f7b265e35bf96ea0037929d8 (patch) | |
tree | 19013d03c563dcb866bceb2b7d6ee30d7ed1b00b | |
parent | d3112e5d2281a9a8d77b7ca1c7dfc0d25cb88143 (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.pro | 6 | ||||
-rw-r--r-- | application-manager.pro | 2 | ||||
-rw-r--r-- | qmake-features/am-config.prf | 2 | ||||
-rw-r--r-- | src/common-lib/crashhandler.cpp | 12 |
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:"); |