Распечатайте имя вызывающей функции в журнале отладки
Objective-C время исполнения кажется довольно надежным, поэтому мне было интересно, есть ли способ зарегистрировать имя функции, которая вызвала текущую функцию (для целей отладки).
Моя ситуация заключается в том, что куча вещей присваивается свойству, а вместо того, чтобы устанавливать точку останова и каждый раз проверять стек вызовов, я хотел бы просто NSLog
имя функции, которая устанавливает свойство, наряду с новым значением.
Итак, можно ли получить доступ к стеку вызовов во время выполнения?
Ответы
Ответ 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]
Я использую его все время в своих проектах.