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。如果他們引起異常,我會期望崩潰堆棧看起來不同。
這似乎是減少到潛在的操作系統錯誤嗎?
好的...這很有道理。該調用的函數可能會從垂死的線程中調用。我已經保護了該方法,以確保它在主線程上自行調用。這並不能保證發送給它的字符串在線程調用者結束並自行清理之後仍然存活。特別感謝這一點。我認爲segfaults可能會被異常處理所捕獲。我很欣賞這些知識。 – 2012-03-22 15:58:16
分段錯誤是由OS發送到應用程序的信號。它們可以通過信號處理程序「捕捉」(請參閱signal()C函數)。信號處理程序可以管理分段錯誤,即使這樣做通常不是個好主意(調試除外),因爲它會使應用程序處於不一致的狀態。 – Macmade 2012-03-22 16:02:06