2014-11-13 1 views
1

잠시 동안 일부 라이브러리 코드에서 어설 션이 실패하게되고 Xcode가 내가 한 일에 대해 앞으로 나올 문제가 있습니다. 이 경우
일반적으로는 (당신의 tableview 행을 삭제하고 데이터 소스 제거하지 않는 예를 들어), 당신은 로그에 다음과 같은 오류가 발생합니다 :Xcode/LLDB가 불필요하게 간결합니다.

*** Assertion failure in -[SomeClass someMethodName:], /Some/Source/Path/File.m:### 
*** Terminating app due to uncaught exception 'SomeException', reason: 'A helpfully descriptive reason for the crash' 

을 최근에, 나는지고있어 첫 번째 줄은 있지만 두 번째 줄은 없습니다. 나는 SomeClass에 대해 나 자신이 잘못한 것을 모호하게 디버깅하는 것이 어렵다. 이 시점에서 디버거에서 계속 실행하면 동일한 줄 (모두 main.m에 있음)과 SIGABRT에서 EXC_BAD_INSTRUCTION (code=EXC_i386_INVOP, subcode=0x0)으로 중지 이유가 변경됩니다.

Xcode가 도움이되는 것을 방해하기 위해 어떻게 변경되었으며 유용성을 다시 켜는 방법은 무엇입니까?

업데이트 2014년 11월 17일 : 나는이 자동 레이아웃 시각적 형식 문자열에 잘못된 일을 넣어 응용 프로그램을 충돌

, 나는 전혀 출력을 얻을 수 없습니다. 그것은 문자열에 대한 다른 오류가 발견되지 않는 뷰에 대해 말해야하지만 위와 동일한 동작으로 디버거에서 일시 중지됩니다. 나는 그 오류 앞에 어서션이 있는지 기억할 수 없지만, 그렇다면이 경우에 둘 다 인쇄되지 않고있다.

+0

시퀀스는 다음과 같습니다. (1) 어설 션 실패, (2) 예외 발생, (3) 예외 되감기 실행, (4) 포착되지 않은 예외가 기록됨, (5) 프로세스가 종료 됨. 그것은 2-4 동안 그 자체가 실패하고 과정을 죽이는 동안 무언가 같이 들린다. –

답변

0

이러한 오류 메시지는 Xcode에서 생성되지 않습니다. 첫 번째 예외는 Foundation 메서드에서 예외가 발생하고 두 번째 예외가 Foundation의 catch되지 않는 예외 처리기에서 출력 될 때 발생합니다. 둘 다 stdout에 기록되므로 디버거 콘솔 창에서 볼 수 있습니다. 프로세스에 연결할 때 Xcode에 메시지가 나타나지 않습니다. 그러면 출력이 Console.app 로그로 이동합니다.

두 번째 줄을 얻지 못하는 이유가 무엇인지 모릅니다. 아마도 기본 잡히지 않은 예외 처리기를 무시하고 있습니다.

어쨌든 예외가 발생했을 때 어떤 일이 일어나는지를 가장 쉽게 파악할 수있는 방법은 ObjC 예외 브레이크 포인트를 켜는 것입니다. 당신은 추가 중단 점 팝업에서 엑스 코드에서이 작업을 수행, 또는와 lldb에 있습니다 : 당신이 중단 점을 명중 할 때

(lldb) break set -E objc 

다음을 수행하십시오

(lldb) po $arg1 

첫 번째 인수가 슬로우되는 예외 객체이며, po은 예외의 이유 필드를 인쇄합니다.

+0

이것은 실제로 질문에 대답하지 않습니다. OP는 예외 사항과 사용 방법을 이해하지만, Xcode가보기에 필요한 모든 정보를 제시하지 못하는 이유를 알고 싶어합니다. –

+0

이 토론에 정보를 추가하기 위해 예외 중단 점을 사용하도록 설정하고 Xcode에서 사용할 수 없도록 설정했습니다. – DanBlakemore

+0

조쉬에게 ... 왜 그렇게 말하지 않았습니까. 요점은이 정보가 Xcode에 의해 생성되지 않는다는 것입니다. 디버거 외부에서 실행될 때 응용 프로그램에서 캐치되지 않는 예외가 발생하면 Console.log (또는 장치 콘솔)에서 동일한 정보를 얻을 수 있습니다. Xcode가이 정보를 보지 못하는 이유에 대한 대답을 Xcode로 보지 않으려 고합니다. Xcode는이 정보를 생성 할 책임이 없었기 때문에 유용한 데이터 요소로 보였습니다. –