From 4e61056743d71dd44fa1c74cb3bdee11a444b7d0 Mon Sep 17 00:00:00 2001 From: Richard Frith-Macdonald Date: Thu, 18 Mar 2021 20:17:35 +0000 Subject: [PATCH] The code in GSPrivateReturnAddresses() and the -symbols method must have ifdefs in matching order so that setup of the information from the stack matches the code used to generate the corresponding symbols. --- Source/NSException.m | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/Source/NSException.m b/Source/NSException.m index b6dcdffb0..9e16ab183 100644 --- a/Source/NSException.m +++ b/Source/NSException.m @@ -891,28 +891,7 @@ unsigned GSPrivateReturnAddresses(NSUInteger **returns) { unsigned numReturns; -#if defined(HAVE_BACKTRACE) - void *addr[MAXFRAMES*sizeof(void*)]; - - numReturns = backtrace(addr, MAXFRAMES); - if (numReturns > 0) - { - *returns = malloc(numReturns * sizeof(void*)); - memcpy(*returns, addr, numReturns * sizeof(void*)); - } -#elif defined(WITH_UNWIND) - void *addr[MAXFRAMES]; - - struct GSBacktraceState state = {addr, addr + MAXFRAMES}; - _Unwind_Backtrace(GSUnwindCallback, &state); - - numReturns = state.current - addr; - if (numReturns > 0) - { - *returns = malloc(numReturns * sizeof(void*)); - memcpy(*returns, addr, numReturns * sizeof(void*)); - } -#elif defined(_WIN32) && !defined(USE_BFD) +#if defined(_WIN32) && !defined(USE_BFD) NSUInteger addr[MAXFRAMES]; (void)pthread_mutex_lock(&traceLock); @@ -1004,6 +983,27 @@ GSPrivateReturnAddresses(NSUInteger **returns) (void)pthread_mutex_unlock(&traceLock); +#elif defined(HAVE_BACKTRACE) + void *addr[MAXFRAMES*sizeof(void*)]; + + numReturns = backtrace(addr, MAXFRAMES); + if (numReturns > 0) + { + *returns = malloc(numReturns * sizeof(void*)); + memcpy(*returns, addr, numReturns * sizeof(void*)); + } +#elif defined(WITH_UNWIND) + void *addr[MAXFRAMES]; + + struct GSBacktraceState state = {addr, addr + MAXFRAMES}; + _Unwind_Backtrace(GSUnwindCallback, &state); + + numReturns = state.current - addr; + if (numReturns > 0) + { + *returns = malloc(numReturns * sizeof(void*)); + memcpy(*returns, addr, numReturns * sizeof(void*)); + } #else int n;