[crashlytics] Xcode11로 빌드 된 iOS13에서만 Crashlytics 스레드가 충돌했습니다.

내 앱은 다음과 같은 호출 스택으로 iOS13에서만 충돌합니다.

#57. Crashed: com.twitter.crashlytics.ios.exception
0  myapp                          0x105d6d494 CLSProcessRecordAllThreads + 376 (CLSProcess.c:376)
1  myapp                          0x105d6d87c CLSProcessRecordAllThreads + 407 (CLSProcess.c:407)
2  myapp                          0x105d5d58c CLSHandler + 26 (CLSHandler.m:26)
3  myapp                          0x105d6bab4 __CLSExceptionRecord_block_invoke + 198 (CLSException.mm:198)
4  libdispatch.dylib              0x1be5c100c _dispatch_client_callout + 20
5  libdispatch.dylib              0x1be5cd804 _dispatch_lane_barrier_sync_invoke_and_complete + 60
6  myapp                          0x105d6b55c CLSExceptionRecord + 205 (CLSException.mm:205)
7  myapp                          0x105d6b390 CLSExceptionRecordNSException + 102 (CLSException.mm:102)
8  myapp                          0x105d6afb4 CLSTerminateHandler() + 258 (CLSException.mm:258)
9  libc++abi.dylib                0x1be6d9634 std::__terminate(void (*)()) + 20
10 libc++abi.dylib                0x1be6d8f58 __cxa_get_exception_ptr + 34
11 libc++abi.dylib                0x1be6d8f10 __cxxabiv1::exception_cleanup_func(_Unwind_Reason_Code, _Unwind_Exception*) + 126
12 libobjc.A.dylib                0x1be6341f8 _objc_exception_destructor(void*) + 362
13 Foundation                     0x1bee05434 -[NSISEngine tryToOptimizeReturningMutuallyExclusiveConstraints] + 322
14 Foundation                     0x1bebfeb94 -[NSISEngine _optimizeWithoutRebuilding] + 72
15 Foundation                     0x1bebfeaa8 -[NSISEngine optimize] + 116
16 Foundation                     0x1bebfe718 -[NSISEngine performPendingChangeNotifications] + 116
17 UIKitCore                      0x1c2e447c4 -[UIView(Hierarchy) layoutSubviews] + 316
18 UIKitCore                      0x1c23c6948 -[UIButton layoutSubviews] + 596
19 UIKitCore                      0x1c2e57abc -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 2156
20 libobjc.A.dylib                0x1be62faf0 -[NSObject performSelector:withObject:] + 68
21 QuartzCore                     0x1c53f60f4 -[CALayer layoutSublayers] + 292
22 QuartzCore                     0x1c53f63fc CA::Layer::layout_if_needed(CA::Transaction*) + 484
23 QuartzCore                     0x1c5409964 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 140
24 QuartzCore                     0x1c534ec1c CA::Context::commit_transaction(CA::Transaction*, double) + 308
25 QuartzCore                     0x1c5379bd8 CA::Transaction::commit() + 684
26 QuartzCore                     0x1c537abc0 CA::Transaction::release_thread(void*) + 232
27 libsystem_pthread.dylib        0x1be62c3c0 _pthread_tsd_cleanup + 584
28 libsystem_pthread.dylib        0x1be624dbc _pthread_exit + 84
29 libsystem_pthread.dylib        0x1be626de8 _pthread_wqthread_legacy_worker_wrap + 98
30 libsystem_pthread.dylib        0x1be626b30 _pthread_wqthread + 424
31 libsystem_pthread.dylib        0x1be62cc78 start_wqthread + 8

--

Fatal Exception: NSInternalInconsistencyException
Modifications to the layout engine must not be performed from a background thread after it has been accessed from the main thread.
0  CoreFoundation                 0x1be919c30 __exceptionPreprocess
1  libobjc.A.dylib                0x1be6340c8 objc_exception_throw
2  Foundation                     0x1bee05434 -[NSISEngine tryToOptimizeReturningMutuallyExclusiveConstraints]
3  Foundation                     0x1bebfeb94 -[NSISEngine _optimizeWithoutRebuilding]
4  Foundation                     0x1bebfeaa8 -[NSISEngine optimize]
5  Foundation                     0x1bebfe718 -[NSISEngine performPendingChangeNotifications]
6  UIKitCore                      0x1c2e447c4 -[UIView(Hierarchy) layoutSubviews]
7  UIKitCore                      0x1c23c6948 -[UIButton layoutSubviews]
8  UIKitCore                      0x1c2e57abc -[UIView(CALayerDelegate) layoutSublayersOfLayer:]
9  libobjc.A.dylib                0x1be62faf0 -[NSObject performSelector:withObject:]
10 QuartzCore                     0x1c53f60f4 -[CALayer layoutSublayers]
11 QuartzCore                     0x1c53f63fc CA::Layer::layout_if_needed(CA::Transaction*)
12 QuartzCore                     0x1c5409964 CA::Layer::layout_and_display_if_needed(CA::Transaction*)
13 QuartzCore                     0x1c534ec1c CA::Context::commit_transaction(CA::Transaction*, double)
14 QuartzCore                     0x1c5379bd8 CA::Transaction::commit()
15 QuartzCore                     0x1c537abc0 CA::Transaction::release_thread(void*)
16 libsystem_pthread.dylib        0x1be62c3c0 _pthread_tsd_cleanup
17 libsystem_pthread.dylib        0x1be624dbc _pthread_exit
18 libsystem_pthread.dylib        0x1be626de8 _pthread_wqthread_legacy_worker_wrap
19 libsystem_pthread.dylib        0x1be626b30 _pthread_wqthread
20 libsystem_pthread.dylib        0x1be62cc78 start_wqthread

나는 전혀 모른다.이 문제가 발생할 수있는 것과 어떻게 재현 할 수 있습니까? 무작위로 충돌합니다. 내 프로젝트에서 Crashlytics v3.14를 사용합니다. 아무도 같은 문제에 직면합니까?



답변

우선 Xcode에서 “주 스레드 검사기”를 켜는 것이 좋습니다. 제품-> 구성표-> 구성표 편집-> 진단으로 이동하십시오.이 창을 볼 진단 탭 수 있습니다. Xcode를 누르고 + 부호를 클릭하고 상징적 중단 점을 추가하면 특정 호출에서 청취하고 메인 스레드에서 호출되는지 여부를 확인하기 위해 조건을 추가 할 수 있습니다.

상징적 인 중단 점

코드에서 버그를 발견하면 내 앱에서와 동일한 충돌이 발생하므로 여기에 게시하십시오. 그래서 버그를 발견했습니다. 그것이 당신을 도울 수 있기를 바랍니다!


답변

앱에서 Google 광고를 사용하도록 설정 했습니까? 그런 다음 Google 광고 SDK 의 버그이거나 iOS 13의 WebKit SDK 구현의 버그 일 수 있습니다 (댓글을 달 수 없으므로 답변으로 게시)

피기 백-2019 년 11 월 19 일 현재 Google Ads 팀의 “공식”솔루션은 위에 링크 된 스레드를 통해 uiwebview 대신 wkwebview를 사용하도록 다음 키 / 페어를 포함하도록 앱의 plist를 수정하는 것입니다.

<key>gad_preferred_webview</key>
<string>wkwebview</string>

출처 : https://groups.google.com/forum/#!category-topic/google-admob-ads-sdk/ios/I4EEWrPPbSc


답변

이 문제는 Google 광고 SDK (7.5XX + iOS13) 때문일 수 있습니다 . 이 스레드를 찾았습니다 .

개발자 Info.plist가 Google Ads 팀에서 제안한 대로 키 쌍 값 이하를 파일 에 사용하려고했습니다 .

<key>gad_preferred_webview</key>
<string>wkwebview</string>

이것은 충돌을 줄 였지만 다른 동결 문제 (100 % CPU 사용량)를 제공합니다.

최근 구글은 7.55.0을 발표했다.

Removed all references to UIWebView. UIWebView is no longer supported.

Google 광고 SDK를 7.55.0


답변

스레드에 대한 스택 추적을 표시하려면 Crashlytics가 충돌 후 코드를 실행해야합니다. 이 코드는 앱의 스레드 중 하나에서 실행되므로 Crashlytics는 항상이 프로세스의 일부로 자체 실행에 대한 정보를 캡처합니다. “CLSProcessRecordAllThreads”기능을 실행하는 스레드가 항상 표시됩니다. 실제로 인라인이라는 컴파일러 최적화로 인해 두 번 이상 볼 수 있습니다.
여기에 이미지 설명을 입력하십시오
예외는 약간의 복잡성을 추가합니다. Objective-C 또는 C ++ 예외가 포착되지 않으면 Crashlytics는 앱이 종료되기 전에 이에 대한 정보를 기록합니다. 이런 상황이 발생하면 예외를 발생시킨 스레드에서 CLSProcessRecordAllThreads 함수를 실행해야합니다. 즉, 예외의 경우 “충돌”스레드가 항상 Crashlytics 코드를 실행중인 것처럼 보입니다. 이는 정상적인 현상이며 예외 상황에서 스택 추적을 캡처하고 표시하는 방식의 결과 일뿐입니다.


답변