2010-02-17 92 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]。