NSThread
имеет метод класса с именем callStackSymbols
(а NSException
имеет метод экземпляра с тем же именем). Извините, я не использую регулярно исключения и не использую также утверждения (не горжусь ни одним из фактов), поэтому я не уверен, что должен делать макрос утверждения.
#define AssertWithStackSymbols(x) \
do { \
if (!(x)) { \
NSLog (@"%s failed assertion\n%@", #x, [NSThread callStackSymbols]); \
abort(); \
} \
} while(0)
Или, как любезно указал KennyTM, вы можете использовать backtrace_symbols
. Существует даже метод, который выводит символы непосредственно в файловый дескриптор, backtrace_symbols_fd
.
#define AssertWithStackSymbols(x) \
do { \
if (!(x)) { \
void *stack[128]; \
int count; \
fputs (#x " failed assertion.\n", stderr); \
count = backtrace (stack, sizeof stack / sizeof (void *)); \
backtrace_symbols_fd (stack, count, STDERR_FILENO); \
} \
while (0)