Xcode - 断言时如何调用堆栈跟踪?

5

现在当我的Xcode中的一个断言被触发时,我会得到断言消息和堆栈转储,其中充满了对我来说不太有意义的数字。

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

如果每次命中断言时都能获得调用堆栈跟踪,那将会更好。

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

2个回答

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)

哦,忘了提醒:callStackSymbols方法仅适用于Mac OS X 10.6。 - dreamlax
1
在OS X 10.5和iPhoneOS上,您可以使用backtrace_symbols(3) - kennytm

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接