Bri*_*ian 31 debugging objective-c stack-trace
Objective-C的运行时似乎相当健壮,所以我想知道是否有办法记录调用当前函数的函数的名称(用于调试目的).
我的情况是,一堆东西分配给一个属性,而不是每次都设置一个断点并检查调用堆栈,我想只是NSLog
设置属性的函数的名称,以及新值.
那么可以在运行时访问调用堆栈吗?
Jer*_*man 44
试试这个:
#include <execinfo.h>
void *addr[2];
int nframes = backtrace(addr, sizeof(addr)/sizeof(*addr));
if (nframes > 1) {
char **syms = backtrace_symbols(addr, nframes);
NSLog(@"%s: caller: %s", __func__, syms[1]);
free(syms);
} else {
NSLog(@"%s: *** Failed to generate backtrace.", __func__);
}
Run Code Online (Sandbox Code Playgroud)
Lor*_*rdT 32
好问题.结合上面的Jeremy's Answer和我们用于调试的内容,你会得到一个很好的字符串:
NSArray *syms = [NSThread callStackSymbols];
if ([syms count] > 1) {
NSLog(@"<%@ %p> %@ - caller: %@ ", [self class], self, NSStringFromSelector(_cmd),[syms objectAtIndex:1]);
} else {
NSLog(@"<%@ %p> %@", [self class], self, NSStringFromSelector(_cmd));
}
Run Code Online (Sandbox Code Playgroud)