Xcode - 在断言上调用堆栈跟踪?

时间:2010-02-17 20:04:31

标签: objective-c xcode assert callstack

现在当我的一个断言在Xcode中被触发时,我得到了断言消息,以及堆栈的转储,其中包含对我来说没有意义的数字。

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

如果每次命中一个断言,我都会得到一个调用堆栈跟踪会好得多。

如何定义将在Xcode中转储调用堆栈跟踪的断言宏?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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