Я хотел бы регистрировать трассировку вызовов во время определенных моментов, таких как ошибочные утверждения или неперехваченные исключения.
Я хотел бы регистрировать трассировку вызовов во время определенных моментов, таких как ошибочные утверждения или неперехваченные исключения.
Ответы:
Ответ n13 не совсем сработал - я немного изменил его, чтобы придумать
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int main(int argc, char *argv[])
{
@autoreleasepool {
int retval;
@try{
retval = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
@catch (NSException *exception)
{
NSLog(@"Gosh!!! %@", [exception callStackSymbols]);
@throw;
}
return retval;
}
}
NSLog(@"[Error] - %@ %@", exception.name, exception.reason);
если вы хотите, чтобы фактическое исключение тоже
Какао уже регистрирует трассировку стека на необработанных исключениях в консоли, хотя они являются просто необработанными адресами памяти. Если вам нужна символическая информация в консоли, то есть пример кода от Apple.
Если вы хотите сгенерировать трассировку стека в произвольной точке вашего кода (и вы находитесь на Leopard), обратитесь к странице справки backtrace. До Leopard вам действительно приходилось копаться в самом стеке вызовов.
Это в значительной степени говорит вам, что делать.
По сути, вам нужно настроить обработку исключений приложений для регистрации, что-то вроде:
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
Для исключений вы можете использовать для этого член NSStackTraceKey из словаря userInfo исключения. См. Контроль ответа программы на исключения на веб-сайте Apple.
backtrace
иbacktrace_symbols
функцию; см. справочную страницу backtrace (3).