现在,当我的断言之一在Xcode中被触发时,我得到了断言消息和堆栈的转储,其中充满了对我来说没有意义的数字。Xcode - 断言调用堆栈跟踪?
为了获得调用堆栈的跟踪,它需要我调试应用程序,并将其运行到断言发生的位置,并希望它再次置位。对于100%可重现的错误,这不是太大的问题,但仍然是浪费时间。
如果在每次触发断言时收到调用堆栈跟踪,情况会好得多。
你如何定义一个断言宏,将在Xcode转储调用堆栈跟踪?
现在,当我的断言之一在Xcode中被触发时,我得到了断言消息和堆栈的转储,其中充满了对我来说没有意义的数字。Xcode - 断言调用堆栈跟踪?
为了获得调用堆栈的跟踪,它需要我调试应用程序,并将其运行到断言发生的位置,并希望它再次置位。对于100%可重现的错误,这不是太大的问题,但仍然是浪费时间。
如果在每次触发断言时收到调用堆栈跟踪,情况会好得多。
你如何定义一个断言宏,将在Xcode转储调用堆栈跟踪?
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)
在iOS 4.x上,您可以使用[NSThread callStackSymbols]。
哦,忘了提及:'callStackSymbols'方法只适用于Mac OS X 10.6。 – dreamlax
在OS X 10.5和iPhoneOS上,您可以使用'backtrace_symbols(3)'。 – kennytm