2012-03-22 4 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 내부에서 던지기 메서드를 호출하지 않았습니다. 내가하고있는 일은 예외, webView 및 htmlString을 NSLog에 덤핑하는 것뿐입니다. 그들이 예외를 일으키는 경우 충돌 스택이 다르게 보일 것으로 예상됩니다.

잠재적 인 OS 버그로 축소되는 것으로 보입니까?

답변

7

이것은 세그멘테이션 오류 (SIGSEGV)입니다. 예외는 아닙니다.

이러한 오류는 예외가 아니므로 try/catch 블록을 사용할 수 없습니다.

세그먼트 화 오류는 앱에 속하지 않는 메모리 영역에 액세스하려고한다는 것을 의미합니다.

경우에 따라 자동 해제 된 개체가 할당이 해제 된 다음 액세스되는 경우 일 수 있습니다 (포인터가 더 이상 유효하지 않습니다. 개체가 할당 취소되었으므로 더 이상 유효하지 않습니다).

당신의 htmlString 변수가 여전히 유효한 개체를 가리키는 확인 ... 그런데

, 내가 setNeedsDisplay를 호출 생각하지 않는다는 loadHTMLString 사용 후 필요하다.

+0

오케이 ... 그건 의미가 있습니다. 호출은 죽어가는 스레드에서 호출 될 수있는 함수에 있습니다. 메소드를 보호하여 메인 스레드에서 자신을 호출하는지 확인했습니다. 이것은 스레드로 보내진 문자열이 스레드 된 호출자가 끝나고 살아남을 때까지 살아남지 않는다고 보장하지 않습니다. 특히 감사합니다. 나는 segfault가 예외 처리와 함께 잡힐 수 있다고 생각했다. 나는 지식에 감사드립니다. –

+0

세그먼트 오류는 신호이며 OS에서 응용 프로그램으로 전송합니다. 그들은 시그널 핸들러에 의해 "잡힐"수있다. (signal() C 함수를 보라). 세그먼트 처리 오류는 신호 처리기에서 관리 할 수 ​​있습니다. 일반적으로 디버깅을 제외하고는 앱을 일관성없는 상태로 둡니다. – Macmade

관련 문제