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

时间:2010-10-28 20:17:41

标签: objective-c debugging stack-trace

Objective-C的运行时似乎相当健壮,所以我想知道是否有办法记录调用当前函数的函数的名称(用于调试目的)。

我的情况是,一堆东西分配给一个属性,而不是每次都设置一个断点并检查调用堆栈,我只想NSLog设置该函数的函数的名称{{1}}财产,以及新的价值。

那么可以在运行时访问调用堆栈吗?

4 个答案:

答案 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]

我在我的项目中一直使用它。