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

Нет исключений stacktrace в консоли под Xcode 4.2/iOS 5?

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

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

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

Update

К сожалению, добавление 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;
}
4b9b3361

Ответ 1

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

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;
}

Для ARC:

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

    int retVal = -1;
    @autoreleasepool {
        @try {
            retVal = UIApplicationMain(argc, argv, nil, nil);
        }
        @catch (NSException* exception) {
            NSLog(@"Uncaught exception: %@", exception.description);
            NSLog(@"Stack trace: %@", [exception callStackSymbols]);
        }
    }
    return retVal;
}

Все еще ждет какое-то объяснение того, почему дамп по умолчанию больше не работает и/или почему (еще более серьезный) uncaughtExceptionHandler не работает. Однако, по-видимому, эта проблема влияет только на эмулятор.

обновление:

Было указано, что если вы перейдете в "Product → Scheme → Edit Scheme", выберите "Run (Debug)", выберите вкладку "Diagnostics" и нажмите "Log Exceptions", это восстановит отсутствующий Xcode по умолчанию исключение регистрации, возможно (я еще не пробовал), устраняя необходимость в вышеупомянутом взломе.

Ответ 2

Это известная проблема... для обходных решений см. здесь и здесь.

Другим вариантом может быть

defaults write NSGlobalDomain NSExceptionHandlingMask 63

Хотя для OSX это может быть полезно при использовании эмулятора - я не могу попробовать это сейчас: - (

Ответ 3

У меня была такая же проблема, и для меня это работало "Compile for Thumb". Примечание. Я только вернул его для конфигурации Debug по понятным причинам.