Objective-C的运行时似乎相当健壮,所以我想知道是否有办法记录调用当前函数的函数的名称(用于调试目的)。
我的情况是,一堆东西分配给一个属性,而不是每次都设置一个断点并检查调用堆栈,我只想NSLog
设置该函数的函数的名称{{1}}财产,以及新的价值。
那么可以在运行时访问调用堆栈吗?
答案 0 :(得分:43)
试试这个:
#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__);
}
答案 1 :(得分:31)
很好的问题。结合上面的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));
}
答案 2 :(得分:2)
没有获取发件人的工具。或者,至少,没有任何以Objective-C为中心。
但是有几种选择。
首先,您可以使用GDB命令。转到GDB控制台并执行以下操作:
comm 1
bt
po argName
cont
或者,您可以使用dtrace。这很难。或者你可以使用仪器使dtrace更容易一些。
或者你可以使用backtrace()函数。请参阅backtrace手册页(x-man-page:// backtrace)。
答案 3 :(得分:0)
有一个名为__PRETTY_FUNCTION__
的C宏将返回一个带有当前函数名称的C-String。如果您想将其转换为NSString以便轻松打印到NSLog,您可以使用
#define NSSTRING_PRETTY_FUNCTION [NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSASCIIStringEncoding]
我在我的项目中一直使用它。