Chciałbym rejestrować ślad połączenia podczas niektórych punktów, takich jak nieudane stwierdzenia lub nieprzechwycone wyjątki.
Chciałbym rejestrować ślad połączenia podczas niektórych punktów, takich jak nieudane stwierdzenia lub nieprzechwycone wyjątki.
Odpowiedzi:
Odpowiedź n13 nie do końca działała - zmodyfikowałem ją nieco, aby to wymyślić
#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);
jeśli chcesz również faktyczny wyjątek
Kakao już rejestruje ślad stosu w przypadku niewyłapanych wyjątków od konsoli, chociaż są to tylko surowe adresy pamięci. Jeśli potrzebujesz informacji symbolicznych w konsoli, jest jakiś przykładowy kod od Apple.
Jeśli chcesz wygenerować ślad stosu w dowolnym punkcie swojego kodu (i jesteś w systemie Leopard), zobacz stronę podręcznika śledzenia. Przed Leopardem musiałeś przekopać sam stos wywołań.
To prawie mówi ci, co masz robić.
Zasadniczo musisz skonfigurować obsługę wyjątków aplikacji do rejestrowania, na przykład:
#import <ExceptionHandling/NSExceptionHandler.h>
[[NSExceptionHandler defaultExceptionHandler]
setExceptionHandlingMask: NSLogUncaughtExceptionMask |
NSLogUncaughtSystemExceptionMask |
NSLogUncaughtRuntimeErrorMask]
W przypadku wyjątków można do tego użyć elementu NSStackTraceKey ze słownika userInfo wyjątku. Zobacz Kontrolowanie reakcji programu na wyjątki w witrynie Apple.
backtrace
ibacktrace_symbols
; patrz strona podręcznika śledzenia (3).