[objective-c] Xcode는 충돌을 일으키는 줄을 표시하지 않습니다.

내 앱이 충돌 할 때마다 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가 크래시를 일으킨 (또는 알 수있는) 원인을 정확히 알고 있지만 여전히 실제 행을 표시하지 않는 것은 분명합니다. 이에 대한 수정 또는 해결 방법이 있습니까?



답변

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

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

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

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

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

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

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


답변

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

좀비 활성화

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

여기에 이미지 설명 입력

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


답변

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

(gdb) info malloc-history 0x543216

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


답변

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

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


답변

인덱스 충돌을 생성하는 코드를 작성했습니다. 다음은 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)을 알려줍니다 .


답변