Как отловить ВСЕ программы, прерывающие ошибки на iPhone? - PullRequest
2 голосов
/ 23 июля 2010

Я написал необработанный модуль ошибок для своего приложения для iPhone, но по некоторым причинам некоторым ошибкам удается его обойти.

У меня есть обработчик исключений и установлены следующие обработчики сигналов:

NSSetUncaughtExceptionHandler(&handleException);
signal(SIGILL, handleSignal);
signal(SIGABRT, handleSignal);
signal(SIGFPE, handleSignal);
signal(SIGBUS, handleSignal);
signal(SIGSEGV, handleSignal);
signal(SIGSYS, handleSignal);
signal(SIGPIPE, handleSignal);

Для большинства вещей (нераспознанный селектор, ошибки с плавающей запятой и т. Д.) Это работает, но, например, когда я запускаю следующий код:

NSString* str = [NSString stringWithFormat:@"a"];
[str release];
[str retain];

Он полностью избегает моего обработчика ошибок и вместо этого печатает этона консоль:

Дамп стека: 0. Выполнение прохода «Объединить избыточные инструкции» для функции «@ glgRunProcessor10» **

У меня был другой, который напечатал следующее(но я не могу вспомнить, какой код я использовал, чтобы вызвать его):

Дамп стека: 0. Выполнение прохода 'Распределитель регистра линейного сканирования' для функции '@ gldLLVMFPTransform5'

Если я сделаю это:

NSString* str = [NSString stringWithFormat:@"a"];
[str release];
[str init];

Он вообще ничего не печатает, а просто выходит из программы.

Кто-нибудь знает надежный способ гарантировать, что ВСЕ ошибкипопасться и пробежатьпроцедура обработчика?

Ответы [ 2 ]

2 голосов
/ 21 сентября 2010

Что ж, получается, что обработчик исключений вызывается каждый раз, но в зависимости от обстоятельств сбоя stdout и stderr могут быть уже закрыты к моменту запуска обработчика ошибок, что означает, что сообщения NSLog () не будутраспечатайте.

Я подтвердил, открыв файл и добавив туда дамп.

1 голос
/ 23 июля 2010

Полагаю, это зависит от того, какой SDK вы используете.
Я проверил следующий код:

NSString * str = [ NSString stringWithFormat: @"a" ];
[ str release ];
[ str retain ];

В SDK 4.1 ошибки нет. Похоже, среда выполнения теперь позволяет это. Он просто печатает журнал на консоль, но приложение не вылетает.

*** __NSAutoreleaseFreedObject (): освобождение ранее освобожденного объекта (0x5f52fb0) игнорируется

В SDK 3.2 вызывается обработчик сигнала (ID сигнала: 10).

Так что попробуйте проверить это с разными версиями SDK. Надеюсь, что это поможет ...

...