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?


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!


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


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


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.