2010-02-17 61 views
5

现在,当我的断言之一在Xcode中被触发时,我得到了断言消息和堆栈的转储,其中充满了对我来说没有意义的数字。Xcode - 断言调用堆栈跟踪?

为了获得调用堆栈的跟踪,它需要我调试应用程序,并将其运行到断言发生的位置,并希望它再次置位。对于100%可重现的错误,这不是太大的问题,但仍然是浪费时间。

如果在每次触发断言时收到调用堆栈跟踪,情况会好得多。

你如何定义一个断言宏,将在Xcode转储调用堆栈跟踪?

回答

5

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) 
+0

哦,忘了提及:'callStackSymbols'方法只适用于Mac OS X 10.6。 – dreamlax

+1

在OS X 10.5和iPhoneOS上,您可以使用'backtrace_symbols(3)'。 – kennytm

1

在iOS 4.x上,您可以使用[NSThread callStackSymbols]。