Нет трассировки стека исключений в консоли в Xcode 4.2 / iOS 5?

В Xcode 3.x и iOS 4, если в эмуляторе сигнализируется необработанное исключение, в выводе консоли создается трассировка стека исключений (похожая на Java).

Когда я вызываю необработанное исключение в iOS 5 под Xcode 4.2, выполняя тот же самый код приложения, трассировка стека не происходит. (Я выяснил, как установить точку останова на исключение, но это не приводит к обратной трассировке в консоли.)

Это просто параметр Xcode, который мне нужно где-то сделать, или «особенность» Xcode 4 / iOS 5? Есть ли способ восстановить эту функциональность?

Обновление

К сожалению, добавление uncaughtExceptionHandler не работает. Вот обработчик:

void uncaughtExceptionHandler(NSException *exception) {
    NSLog(@"uncaughtExceptionHnadler -- Exception %@", [exception description]);
    // Because iOS 5 doesn't provide a traceback, provide one here
    NSLog(@"Stack trace: %@", [exception callStackSymbols]);
    // Let Flurry look at the error
    [FlurryAPI logError:@"Uncaught" message:@"Crash!" exception:exception];
}                                               

(Оказывается, он уже присутствовал для работы с Flurry, поэтому я просто добавил трассировку стека.)

Вот где он включен (несколько строк ниже, где находится обработчик.) объявлен):

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    // Enable uncaught exception handler to dump stack and let Flurry log the exception
    NSUncaughtExceptionHandler* hdlr = NSGetUncaughtExceptionHandler();
    NSSetUncaughtExceptionHandler(&uncaughtExceptionHandler);
    NSUncaughtExceptionHandler* newHdlr = NSGetUncaughtExceptionHandler();

    // TODO: Test
    NSException* ex = [NSException exceptionWithName:@"AssertionFailure" reason:@"Test" userInfo:nil]; 
    @throw ex; 

Я установил точки останова, чтобы позволить мне проверить два полученных значения обработчика. Первый - ноль, а второй - очевидно действительный адрес. Но когда возникает тестовое исключение, обработчик (в симуляторе iOS 5) никогда не получает управление. (Хотя, когда я запускаю симулятор iOS 4.2, он получает контроль.)

Настройка NSExceptionHandlingMask , очевидно, невозможна на iPhone. Предварительный ExceptionHandling.framework недоступен.

Обновление 2

Это работает:

int main(int argc, char *argv[]) {

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = -1;
    @try {
        retVal = UIApplicationMain(argc, argv, nil, nil);
    }
    @catch (NSException* exception) {
        NSLog(@"Uncaught exception: %@", exception.description);
        NSLog(@"Stack trace: %@", [exception callStackSymbols]);
    }
    [pool release];
    return retVal;
}
48
задан Roman C 19 March 2016 в 08:45
поделиться