2010-07-23 80 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版本進行測試。希望這個幫助......

相關問題