2010-07-23 79 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]; 

这完全避免了我的错误处理程序,而是打印此控制台:

堆栈转储: 0运行通功能上“@ glgRunProcessor10”结合冗余指令“**

我有另外一个印刷以下(但我不记得我跑什么样的代码,以使其):

堆栈转储: 0运行通 '线性扫描寄存器分配' 的功能, '@ gldLLVMFPTransform5'

如果我这样做:

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

它根本不打印任何东西,只是退出程序。

有没有人知道确保所有错误被捕获并通过处理程序运行的绝对方法?

回答

2

嗯,事实证明,每次都会调用异常处理程序,但根据崩溃的情况,错误处理程序运行时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版本进行测试。希望这个帮助......

相关问题