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)