2010-07-23 3 views
2

Я написал необработанный модуль ошибок для своего iPhone-приложения, но по некоторым причинам некоторые ошибки обходят его.Как уловить ВСЕ ошибки прерывания программы на 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]; 

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

Stack свалка: 0. Running прохода «Combine излишних инструкций» на функцию «@ glgRunProcessor10» **

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

Stack свалка: 0. Running проход 'Linear Scan Регистрация Allocator' на функцию '@ gldLLVMFPTransform5'

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

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

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

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

ответ

2

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

Я подтвердил это, открыв файл и сбрасывая материал вместо этого.

1

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

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

С SDK 4.1, нет никакой ошибки. Кажется, теперь это позволяет время выполнения. Он просто печатает журнал на консоли, но приложение не сбой.

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

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

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