代码之家  ›  专栏  ›  技术社区  ›  Brian

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

  •  30
  • Brian  · 技术社区  · 15 年前

    我的情况是,有很多东西分配给一个属性,而不是每次都设置一个断点并检查调用堆栈,我只想 NSLog 正在设置属性的函数的名称以及新值。

    4 回复  |  直到 15 年前
        1
  •  44
  •   Jeremy W. Sherman    15 年前

    试试这个:

    #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__);
    }
    
        2
  •  32
  •   Blitz    14 年前

    好问题。结合上面Jeremy的回答和我们在调试中经常使用的内容,您将得到一个很好的字符串,如下所示:

    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)); 
    }
    
        3
  •  2
  •   bbum    15 年前

    没有获取发件人的工具。或者,至少,没有以目标C为中心的东西。

    不过,还有两种选择。

    首先,可以使用GDB命令。转到GDB控制台并执行以下操作:

    comm 1
    bt
    po argName
    cont
    

    或者,可以使用dtrace。这很难。或者你可以使用一些使dtrace更容易的工具。

    或者可以使用backtrace()函数。请参阅回溯手册页(x-man-page://backtrace)。

        4
  •  0
  •   Jose Ibanez    15 年前

    有一个C宏叫做 __PRETTY_FUNCTION__ 它将返回一个C字符串,其中包含当前函数的名称。如果要将其转换为NSString以便轻松打印到NSLog,可以使用

    #define NSSTRING_PRETTY_FUNCTION [NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSASCIIStringEncoding]
    

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