現在,當我的斷言之一在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