Подтвердить что ты не робот

Распечатайте имя вызывающей функции в журнале отладки

Objective-C время исполнения кажется довольно надежным, поэтому мне было интересно, есть ли способ зарегистрировать имя функции, которая вызвала текущую функцию (для целей отладки).

Моя ситуация заключается в том, что куча вещей присваивается свойству, а вместо того, чтобы устанавливать точку останова и каждый раз проверять стек вызовов, я хотел бы просто NSLog имя функции, которая устанавливает свойство, наряду с новым значением.

Итак, можно ли получить доступ к стеку вызовов во время выполнения?

4b9b3361

Ответ 1

Попробуйте следующее:

#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

Отличный вопрос. Объединяя ответ Джереми выше и то, что мы всегда используем для нашей отладки, вы получите красивую строку, подобную этой:

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

Нет никаких средств для получения отправителя. Или, по крайней мере, ничто не ориентировано на Objective-C.

Однако есть несколько альтернатив.

Во-первых, вы можете использовать команды GDB. Перейдите в консоль GDB и сделайте что-то вроде:

comm 1
bt
po argName
cont

В качестве альтернативы вы можете использовать dtrace. Это трудно. Или вы можете использовать инструменты, которые упрощают dtrace.

Или вы можете использовать функцию backtrace(). См. Справочную страницу backtrace (x-man-page://backtrace).

Ответ 4

Существует макрос C с именем __PRETTY_FUNCTION__, который вернет C-String с именем текущей функции. Если вы хотите преобразовать это в NSString для простой печати в NSLog, вы можете создать макрос с

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

Я использую его все время в своих проектах.