Wątek Crashlytics rozbił się tylko na iOS13 zbudowanym z Xcode11

18

Moja aplikacja ulega awarii tylko na iOS13 z następującym stosem połączeń:

#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

Absolutnie nie mam pojęcia, co może powodować ten problem i jak się rozmnażać. Rozbija się losowo. Używam Crashlytics v3.14 w moim projekcie. Czy ktoś ma ten sam problem?

bemul12
źródło
1
Nadal masz ten problem
Anjula S.

Odpowiedzi:

9

Przede wszystkim zalecam włączenie „Głównego sprawdzania wątków”, w Xcode, przejdź do Produkt -> Schemat -> Edytuj schemat -> Diagnostyka, powinieneś zobaczyć to okno. Karta diagnostyczna Inną rzeczą, którą możesz wypróbować, jest przejście do sekcji punktów przerwania w Xcode i kliknięcie znaku + i dodanie symbolicznego punktu przerwania, który będzie nasłuchiwał określonego połączenia, i możesz dodać do niego warunek sprawdzania, czy jest on wywoływany w głównym wątku.

Symboliczny punkt przerwania

Jeśli zdarzy ci się znaleźć błąd w kodzie, opublikuj go tutaj, ponieważ mam taką samą awarię jak ty w mojej aplikacji, więc to jest tak daleko, jak poszedłem do znalezienia błędu. Mam nadzieję, że to ci pomoże!

Laurynas Letkauskas
źródło
Próbowałem tej sugestii, ale niestety nie złapałem awarii.
bemul12
Mój problem polegał na lokalnej autoryzacji (identyfikator dotykowy, identyfikator twarzy), prezentowałem inny kontroler widoku w wątku w tle, a moja aplikacja uległa awarii dopiero później po losowym korzystaniu z aplikacji przez około 2 minuty. Możesz spróbować to sprawdzić
Laurynas Letkauskas
Jeśli dobrze rozumiem, problem został wykryty przez główny moduł sprawdzania wątków i znalazłeś go w sekcji ostrzeżeń środowiska wykonawczego. Sprawdziłem wiele przepływów w mojej aplikacji i nie otrzymałem ostrzeżeń w czasie wykonywania przez główny moduł sprawdzania wątków.
bemul12
To nie było dokładnie po zamknięciu uwierzytelnienia. W rzeczywistości dzwoniłem do metody delegowania od zamknięcia, mówiąc kontrolerowi widoku, że użytkownik jest uwierzytelniony, zacznij budować ekran główny, który wydawał się tworzyć instancję paska kart, gdy wciąż znajdował się w wątku w tle, i tam właśnie sprawdzał główny wątek zadziałało, więc wykopałem i dowiedziałem się, że delegat nie jest powołany w głównym wątku - to problem
Laurynas Letkauskas
17

Czy masz włączone reklamy Google w swojej aplikacji? Może to być błąd w reklamach Google SDK lub błąd w implementacji pakietu WebKit SDK w systemie iOS 13. (Oczywiście nie mogę komentować, więc zamieszczam to jako odpowiedź)

Piggybacking z tego - czytając powyższy link, „oficjalnym” rozwiązaniem zespołu Google Ads od 19 listopada 2019 jest modyfikacja listy aplikacji w celu włączenia następującego klucza / pary, aby używać wkwebview zamiast uiwebview.

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

Źródło: https://groups.google.com/forum/#!category-topic/google-admob-ads-sdk/ios/I4EEWrPPbSc

own2pwn
źródło
Dziękuję za odpowiedź. Nie mam reklam Google w mojej aplikacji, ale mam w niej UIWebView, ale UIWebView jest częścią UIKit, a nie WebKit.
bemul12
Czy korzystasz z UIWebView lub WKWebview?
own2pwn
2
Ten sam problem tutaj. Nadal czekam na nową aktualizację Google. W bieżącej wersji (7.52.0) ten błąd nadal występuje.
fdlr
1
@nab Możliwe, że tak. Jeden programista zgłosił utratę dochodów, powołując się na spadek o „pokaż stawkę” ~ 10% groups.google.com/d/msg/google-admob-ads-sdk/PuHOKMX1mVI/... A inny zgłosił spadek odsetka „pokaż stawkę”: grupy .google.com / d / msg / google-admob-ads-sdk / PuHOKMX1mVI /…
262Hz
1
Oto „oficjalne” rozwiązanie od Google: groups.google.com/forum /#! category-topic /google- admob- ads- sdk/... ale zauważmy, że istnieje jeden znany problem: reklamy z dźwiękiem ZAWSZE odtwarzają dźwięk, niezależnie od tego włączonego przełącznika wibracji.
262 Hz
6

Przyczyną tego problemu może być zestaw reklam Google SDK (7.5XX + iOS13), który znalazł ten wątek .

Programiści próbowali użyć poniżej wartości pary kluczy w Info.plistpliku zgodnie z sugestią zespołu Google Ads.

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

Zmniejszyło to awarię, ale powoduje kolejny problem z zawieszeniem (100% wykorzystania procesora).

Niedawno Google wydało 7.55.0 z notatką:

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

więc spróbuj zaktualizować SDK reklam Google do 7.55.0

aryjski
źródło
3

Aby pokazać ślady stosu dla twoich wątków, Crashlytics musi uruchomić kod po awarii. Ponieważ ten kod jest wykonywany w jednym z wątków aplikacji, Crashlytics zawsze przechwytuje informacje o swoim własnym wykonaniu w ramach tego procesu. Zawsze zobaczysz wątek wykonujący funkcję „CLSProcessRecordAllThreads”. W rzeczywistości zobaczysz to więcej niż raz, dzięki optymalizacji kompilatora o nazwie inlining. wprowadź opis zdjęcia tutaj Wyjątki zwiększają złożoność. Gdy wyjątek Objective-C lub C ++ nie zostanie przechwycony, Crashlytics zapisuje pewne informacje na jego temat, zanim aplikacja może się zakończyć. W takim przypadku funkcja CLSProcessRecordAllThreads musi zostać uruchomiona w wątku, który zgłosił wyjątek. Oznacza to, że w przypadku wyjątku „awaria” wątku zawsze będzie wyglądać tak, jakby działał kod Crashlytics. Jest to normalne i jest tylko artefaktem tego, w jaki sposób przechwytujemy i prezentujemy ślady stosu w czasie wyjątku.

Zubair
źródło
1
Ponieważ „awaria wątku zawsze będzie wyglądać tak, jakby działał kod Crashlytics”, w jaki sposób można ustalić, jaki jest rzeczywisty awaria wątku?
wilc0