Xcode는 충돌을 일으키는 줄을 표시하지 않습니다.


126

내 앱이 충돌 할 때마다 Xcode는 main () 함수의 UIApicationMain () 호출을 충돌을 일으킨 줄로 강조 표시합니다. 어떤 경우에는 정상적 이었지만 (예를 들어 분할 오류) 처리하려는 충돌은 콘솔에 자세한 정보가 기록 된 간단한 SIGABRT입니다.

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary setObject:forKey:]: attempt to insert nil value (key: Date)'

Xcode는 이전 SDK에서 바로 줄을 표시하는 데 사용되었지만 Xocde 4.2로 업그레이드 한 이후 변경되었습니다. Xcode가 크래시를 일으킨 (또는 알 수있는) 원인을 정확히 알고 있지만 여전히 실제 행을 표시하지 않는 것은 분명합니다. 이에 대한 수정 또는 해결 방법이 있습니까?


2
릴리스를 위해 컴파일하고 있습니까? 그렇다면 구성표를 디버그로 설정하십시오.
epatel 2011 년

또한 일부 xib가 잘못되어 프로그램이 자신의 소스 코드 외부에서 충돌하여 파일을 표시하지 않을 수 있습니다. 이 오류는 "날짜"라는 이름의 사전 키에 대한 문제를 설명
epatel

1
애플은 더 테스터를 고용해야한다)
아 므르 Lotfy에게

답변:


301

또한 모든 예외에 대해 중단 점이 설정되어 있는지 확인해야합니다. 이로 인해 예외가 발생하는 줄에서 Xcode가 중지됩니다. [Xcode 4에서] 다음을 수행하십시오.

  1. Xcode의 왼쪽에있는 프로젝트 네비게이터에서 중단 점 네비게이터를 클릭하십시오 (상단 버튼 막대의 오른쪽 끝까지 거의 오른쪽에 있습니다. 아이콘은 뚱뚱한 오른쪽 화살표처럼 보입니다).

  2. 네비게이터 하단에서 "+"버튼을 클릭합니다.

  3. "예외 중단 점 추가"를 클릭합니다.

  4. 새로운 중단 점이 생성됩니다. 필요에 따라 구성해야하지만 동작을 조정할 수 있습니다.

  5. 프로젝트를 실행하고 예외를 재현하십시오.

또한 일부 타사 라이브러리 / 프레임 워크에 연결했다고 언급했습니다. 이러한 프레임 워크 내에서 예외가 발생하면 코드가 컴파일되고 Xcode가 실제로 예외를 일으킨 줄을 표시 할 수 없기 때문에 어려움을 겪을 것입니다. 이 경우 라이브러리를 올바르게 사용하고 있다고 확신하는 경우 해당 라이브러리의 관리자에게 버그 보고서를 제출해야합니다.


4
나는 멍청이이고 이것없이 거의 한 달을 발전시켰다. 이것은 내 인생을 바꾼다.
Jonny Burger

4
내 친구가이 게시물을 찬성하기 위해 SO 계정에 등록했습니다.
Alex Spencer

1
이것은 나의 책에 사과 부분에 반 assing라고
ChuckKelly

1
이런 짓을하지만 :( 널의 길이라는 곳 여전히 찾을 수 없습니다
Shereef Marzouk

1
이것은 작동하지만 단점은 더 이상 디버그 콘솔에서 예외에 대한 세부 정보를 출력하지 않는다는 것입니다. 따라서이 중단 점을 끄고 예외의 세부 사항과 추적을 볼 수 있지만 발생한 위치는 볼 수 없습니다. 또는 발생 위치를 확인하기 위해 켜고 이유는 표시하지 않습니다. 누구든지 둘 다 갖는 방법을 알고 있습니까?
Gabriel Jensen

27

이 StackOverflow 답변의 지침을 따르십시오.

좀비 활성화

기본적으로 "좀비 활성화"만하면됩니다. 그런 다음 Xcode는 문제를 일으킨 줄에서 중단됩니다.

여기에 이미지 설명 입력

(2017 년에도 Xcode에서이 기능이 기본적으로 꺼져 있다는 사실은 충격적입니다. 문제를 일으킨 줄을보고 싶지 않은 이유는 무엇 입니까? 그리고 " 좀비 개체 활성화 "?! 정말?! Xcode 작성자가 정말 이 이름이 유용한 이름이라고 믿으세요. 새로운 개발자에게 어떤 의미가 있을지? 앱 스토어에서 Xcode의 등급이 해마다 얼마나 낮은 지 우울합니다. 아무도 듣고 있지 않습니다 ...)


6
Xcode는 내가 지금까지 사용한 최악의 프로그래밍 환경입니다.
학생

내가 흥미로운 것은 (Visual Studio 개발자로서) 얼마나 많은 Xcode 개발자를 만났는지, Xcode가 지금까지 사용 해본 환경 중 최고의 환경이라고 주장하는 것입니다. 논리적이고 친절하며 도움이되지만 몇 가지 단점이 있습니다. 지금도 2019 년 11 월 Xcode의 App Store 등급은 3.1이며 대부분의 사람들은 별 5 개 또는 1 개를 부여합니다. 수신 대기 아무도 ...
마이크 Gledhill

10

편집 현재의 계획 및 활성화 NSZombieEnabled, MallocStackLoggingguard malloc. 그런 다음 앱이 충돌하면 gdb 콘솔에 다음을 입력합니다.

(gdb) info malloc-history 0x543216

0x543216를 일으킨 객체의 주소로 바꾸면 NSInvalidArgumentException훨씬 더 유용한 스택 추적을 제공하여 충돌을 일으킨 코드 줄을 보여줍니다.


1
나는 이것을 시도하고 오류가 발생했습니다 .'info '는 유효한 명령이 아닙니다. 어떤 충고?
achi

@EliGregory는 디버거가 기본 lldb가 아닌 gdb로 설정되어 있는지 확인합니다. 실행 섹션 아래의 Edit Scheme 메뉴에서 변경할 수 있습니다.
chown하지

2

고도로 최적화 된 코드에서이 동작을 보았습니다. 대상의 최적화 수준과 타사 라이브러리의 최적화 수준을 확인하고 조정하면 도움이 될 수 있습니다. (LLVM 3.0 최적화 수준 설정)

디버그 기호를 생성하고 있습니까?


동의합니다. 디버그를 시도하는 경우 빌드 설정에서 최적화 수준을 0 (최적화 없음)으로 설정해야합니다.
Carter

1

인덱스 충돌을 생성하는 코드를 작성했습니다. 다음은 throw 된 예외입니다.

2017-01-07 04:02:57.606 testABC[1694:52966] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSSingleObjectArrayI objectAtIndex:]: index 1 beyond bounds [0 .. 0]'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010e85cd4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010e2be21e objc_exception_throw + 48
    2   CoreFoundation                      0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111
    3   testABC                             0x000000010dce962d -[ViewController ComplexFunction] + 61
    4   testABC                             0x000000010dce95db -[ViewController thirdFunction] + 43
    5   testABC                             0x000000010dce959b -[ViewController secondFunction] + 43
    6   testABC                             0x000000010dce955b -[ViewController firstFinction] + 43
    7   testABC                             0x000000010dce96c2 -[ViewController viewDidAppear:] + 50
    8   UIKit                               0x000000010ee28a6c -[UIViewController _setViewAppearState:isAnimating:] + 945
    9   UIKit                               0x000000010ee2b7da __64-[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:]_block_invoke + 42
    10  UIKit                               0x000000010ee29ac4 -[UIViewController _executeAfterAppearanceBlock] + 86
    11  UIKit                               0x000000010ec8d77c _runAfterCACommitDeferredBlocks + 653
    12  UIKit                               0x000000010ec7a273 _cleanUpAfterCAFlushAndRunDeferredBlocks + 566
    13  UIKit                               0x000000010ec9d757 __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke_2 + 194
    14  CoreFoundation                      0x000000010e8016ac __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12
    15  CoreFoundation                      0x000000010e7e66f4 __CFRunLoopDoBlocks + 356
    16  CoreFoundation                      0x000000010e7e5e65 __CFRunLoopRun + 901
    17  CoreFoundation                      0x000000010e7e5884 CFRunLoopRunSpecific + 420
    18  GraphicsServices                    0x00000001126d9a6f GSEventRunModal + 161
    19  UIKit                               0x000000010ec80c68 UIApplicationMain + 159
    20  testABC                             0x000000010dce99df main + 111
    21  libdyld.dylib                       0x000000011174968d start + 1
    22  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

주의 깊게 읽으면 First Throw call stack

0   CoreFoundation              0x000000010e85cd4b __exceptionPreprocess + 171
1   libobjc.A.dylib             0x000000010e2be21e objc_exception_throw + 48

0 and 1 충돌 후 시스템 프로세스입니다.

 2   CoreFoundation             0x000000010e8b5c2f -[__NSSingleObjectArrayI objectAtIndex:] + 111

2 예외를 일으킨 라인입니다.

3   testABC                     0x000000010dce962d -[ViewController ComplexFunction] + 61

3예외가 발생한 클래스 이름 ( ViewController)과 함수 naem ( ComplexFunction)을 알려줍니다 .


4
응, 알았어. 당신 말이 맞아요,하지만이게 다정 해요? 현대 (1990 년대 이후) 개발 환경에서 예외가 발생하면 문제를 일으킨 라인으로 이동합니다. 반면에 Xcode는 ... 음 ... 이와 같은 스택 추적을 제공합니다. 터보 파스칼조차도 이렇게 구식이 아니 었습니다 !!!
Mike Gledhill

4
"최고의 사용자 경험"으로 알려진 회사가 지난 20 년 동안 모든 개발자가 어셈블러가 아닌 예외가 발생하는 줄 번호를 보는 데 익숙하다는 사실을 깨닫지 못하는 것은 우스꽝스러운 일입니다. 내가 미쳤나? 평생 작업 해 본 모든 언어는 줄 번호를 제공합니다. 심지어 C 또는 C ++.
mylovemhz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.