2012-03-22 59 views
2

我收到了以下崩潰報告(截)我是如何在@ try/@ catch塊中崩潰的?

Exception Type: EXC_CRASH (SIGSEGV) 
Exception Codes: 0x00000000, 0x00000000 
Crashed Thread: 0 

Thread 0 name: Dispatch queue: com.apple.main-thread 
Thread 0 Crashed: 
0 libsystem_kernel.dylib   0x36df00d8 __psynch_mutexwait + 24 
1 libsystem_c.dylib    0x31760674 pthread_mutex_lock + 376 
2 CoreFoundation     0x31f2338a CFRunLoopWakeUp + 50 
3 WebCore       0x308d0bc8 _WebThreadRun + 284 
4 UIKit       0x37921c7a -[UIWebDocumentView _runLoadBlock:] + 38 
5 UIKit       0x37921c3a -[UIWebDocumentView _cleanUpFrameStateAndLoad:] + 114 
6 UIKit       0x37921bbe -[UIWebDocumentView loadHTMLString:baseURL:] + 78 

關注的是,調用代碼看起來是這樣的:

@try { 
    [webView loadHTMLString:htmlString baseURL:nil]; 
    [webView setNeedsDisplay];  
} 
@catch (NSException *exception) {...} 

那麼,爲什麼我設法從異常中拋出異常處理程序?

我沒有從catch裏面調用拋出方法。我在那裏做的是向NSLog傾倒異常,webView和htmlString。如果他們引起異常,我會期望崩潰堆棧看起來不同。

這似乎是減少到潛在的操作系統錯誤嗎?

回答

7

這是一個分段錯誤(SIGSEGV),不是一個例外。

這些故障並不是例外,這意味着您不能使用try/catch塊。

分段錯誤意味着您試圖訪問不屬於您的應用程序的內存區域。

在你的情況,它可能是因爲自動釋放的對象被取消分配,然後被訪問(由於對象被釋放,指針不再有效)。

確保您htmlString變量仍然指向一個有效的對象......

順便說一句,我不認爲調用setNeedsDisplay使用loadHTMLString後是必要的。

+0

好的...這很有道理。該調用的函數可能會從垂死的線程中調用。我已經保護了該方法,以確保它在主線程上自行調用。這並不能保證發送給它的字符串在線程調用者結束並自行清理之後仍然存活。特別感謝這一點。我認爲segfaults可能會被異常處理所捕獲。我很欣賞這些知識。 – 2012-03-22 15:58:16

+0

分段錯誤是由OS發送到應用程序的信號。它們可以通過信號處理程序「捕捉」(請參閱​​signal()C函數)。信號處理程序可以管理分段錯誤,即使這樣做通常不是個好主意(調試除外),因爲它會使應用程序處於不一致的狀態。 – Macmade 2012-03-22 16:02:06