将调用函数的名称打印到调试日志中

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)

  • 固定.哦,基金会实际上只是通过` - [NSThread callStackSymbols]`公开这个,它返回一个数组.您可以将它用作`NSArray*syms = [[NSThread currentThread] callStackSymbols]; if([syms count]> 1)NSLog(@"caller:%@",[syms objectAtIndex:1U];` (14认同)
  • 最后评论:`callStackSymbols`是一种类方法.你必须将它用作`[NSThread callStackSymbols]` (5认同)

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)