diff options
-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:"); |