lon*_*hot 5 xcode callstack assert objective-c
现在,当我的一个断言在Xcode中被触发时,我得到了断言消息,以及堆栈的转储,其中充满了对我来说没有意义的数字.
为了获得调用堆栈的跟踪,它需要我调试应用程序,并将其运行到发生断言的位置,并希望它再次断言.对于100%可重现的错误,这不是一个太大的问题,但仍然是浪费时间.
如果我在每次命中一个断言时得到一个调用堆栈跟踪,那会好得多.
如何定义将在Xcode中转储调用堆栈跟踪的断言宏?
NSThread有一个叫做的类方法callStackSymbols(并且NSException有一个同名的实例方法).对不起,我不经常使用异常,也不经常使用断言(不为任何一个事实感到自豪),所以我不确定断言宏应该做什么.
#define AssertWithStackSymbols(x) \
do { \
if (!(x)) { \
NSLog (@"%s failed assertion\n%@", #x, [NSThread callStackSymbols]); \
abort(); \
} \
} while(0)
Run Code Online (Sandbox Code Playgroud)
或者,正如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)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2923 次 |
| 最近记录: |