如何捕获iPhone上所有程序中止错误?

如何捕获iPhone上所有程序中止错误?,iphone,xcode,exception,handler,signals,Iphone,Xcode,Exception,Handler,Signals,我已经为我的iPhone应用程序编写了一个未经处理的错误模块,但由于某些原因,一些错误正在设法绕过它 我有一个异常处理程序和以下信号处理程序集: NSSetUncaughtExceptionHandler(&handleException); signal(SIGILL, handleSignal); signal(SIGABRT, handleSignal); signal(SIGFPE, handleSignal); signal(SIGBUS, handleSignal); sig

我已经为我的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];
NSString * str = [ NSString stringWithFormat: @"a" ];
[ str release ];
[ str retain ];
它完全避免了我的错误处理程序,而是将其打印到控制台:

堆栈转储: 0在函数“@glgRunProcessor10”上运行pass“合并冗余指令”**

我有另一个打印了以下内容(但我不记得是什么代码导致的):

堆栈转储: 0在函数“@gldLLVMFPTransform5”上运行pass“线性扫描寄存器分配器”

如果我这样做:

NSString* str = [NSString stringWithFormat:@"a"];
[str release];
[str init];
它根本不打印任何内容,只是退出程序


有人知道一种可靠的方法来确保所有错误都被捕获并通过处理程序例程运行吗?

我想这取决于您使用的SDK。
我已经测试了以下代码:

NSString* str = [NSString stringWithFormat:@"a"];
[str release];
[str retain];
NSString * str = [ NSString stringWithFormat: @"a" ];
[ str release ];
[ str retain ];
对于SDK 4.1,没有错误。现在运行时似乎允许这样做。它只是将日志打印到控制台,但应用程序不会崩溃

***\uu NSAutoreleaseFreedObject():忽略先前释放的对象(0x5f52fb0)的释放

在SDK 3.2中,调用信号处理程序(信号ID:10)


所以试着用不同的SDK版本来测试它。希望有帮助…

事实证明,每次都会调用异常处理程序,但根据崩溃情况,在错误处理程序运行时,stdout和stderr可能已经关闭,这意味着不会打印NSLog()消息

我通过打开一个文件并将内容转储到该文件来进行确认