[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에서] 다음을 수행하십시오.
-
Xcode의 왼쪽에있는 프로젝트 네비게이터에서 중단 점 네비게이터를 클릭하십시오 (상단 버튼 막대의 오른쪽 끝까지 거의 오른쪽에 있습니다. 아이콘은 뚱뚱한 오른쪽 화살표처럼 보입니다).
-
네비게이터 하단에서 “+”버튼을 클릭합니다.
-
“예외 중단 점 추가”를 클릭합니다.
-
새로운 중단 점이 생성됩니다. 필요에 따라 구성해야하지만 동작을 조정할 수 있습니다.
-
프로젝트를 실행하고 예외를 재현하십시오.
또한 일부 타사 라이브러리 / 프레임 워크에 연결했다고 언급했습니다. 이러한 프레임 워크 내에서 예외가 발생하면 코드가 컴파일되고 Xcode가 실제로 예외를 일으킨 줄을 표시 할 수 없기 때문에 어려움을 겪을 것입니다. 이 경우 라이브러리를 올바르게 사용하고 있다고 확신하는 경우 해당 라이브러리의 관리자에게 버그 보고서를 제출해야합니다.
답변
이 StackOverflow 답변의 지침을 따르십시오.
기본적으로 “좀비 활성화”만하면됩니다. 그런 다음 Xcode는 문제를 일으킨 줄에서 중단됩니다.
(2017 년에도 Xcode에서이 기능이 기본적으로 꺼져 있다는 사실은 충격적입니다. 문제를 일으킨 줄을보고 싶지 않은 이유는 무엇 입니까? 그리고 ” 좀비 개체 활성화 “?! 정말?! Xcode 작성자가 정말 이 이름이 유용한 이름이라고 믿으세요. 새로운 개발자에게 어떤 의미가 있을지? 앱 스토어에서 Xcode의 등급이 해마다 얼마나 낮은 지 우울합니다. 아무도 듣고 있지 않습니다 …)
답변
편집 현재의 계획 및 활성화 NSZombieEnabled
, MallocStackLogging
및 guard 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
)을 알려줍니다 .