Crashlytics-Thread stürzte nur unter iOS13 ab, das mit Xcode11 erstellt wurde

18

Meine App ist nur unter iOS13 mit dem folgenden Aufrufstapel abgestürzt:

#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

Ich habe absolut keine Ahnung, was bei diesem Problem auftreten kann und wie ich es reproduzieren kann. Es stürzt zufällig ab. Ich verwende Crashlytics v3.14 in meinem Projekt. Hat jemand das gleiche Problem?

bemul12
quelle
1
Haben Sie noch dieses Problem
Anjula S.

Antworten:

9

Zunächst würde ich empfehlen, den "Haupt-Thread-Checker" in Xcode zu aktivieren. Gehen Sie zu Produkt -> Schema -> Schema bearbeiten -> Diagnose. Sie sollten dieses Fenster sehen. Registerkarte Diagnose Eine andere Sache, die Sie versuchen könnten, ist, zu Ihrem Haltepunktabschnitt in zu gehen Xcode und Klicken auf das + -Zeichen und Hinzufügen eines symbolischen Haltepunkts, der einen bestimmten Anruf abhört, und Sie können ihm eine Bedingung hinzufügen, um zu überprüfen, ob er im Hauptthread aufgerufen wird.

Ein symbolischer Haltepunkt

Wenn Sie Ihren Fehler im Code finden, posten Sie ihn bitte hier, da in meiner App derselbe Absturz wie Sie auftritt. Ich bin also so weit gegangen, um den Fehler herauszufinden. Hoffe es hilft dir raus!

Laurynas Letkauskas
quelle
Ich habe diesen Vorschlag ausprobiert, aber leider habe ich den Absturz nicht mitbekommen.
bemul12
Mein Problem lag in der lokalen Autorisierung (Touch-ID, Gesichts-ID), ich präsentierte einen anderen Ansichts-Controller in einem Hintergrund-Thread und meine App stürzte erst später ab, nachdem ich die App etwa 2 Minuten lang zufällig verwendet hatte. Sie könnten versuchen, das herauszufinden
Laurynas Letkauskas
Wenn ich das richtig verstehe, wurde Ihr Problem vom Haupt-Thread-Prüfer abgefangen und Sie haben es im Abschnitt Laufzeitwarnungen gefunden. Ich habe viele Flows in meiner App überprüft und keine Laufzeitwarnungen vom Haupt-Thread-Checker erhalten.
bemul12
Es war nicht gerade der Abschluss der Authentifizierung. Ich habe tatsächlich eine Delegate-Methode aus dem Closure aufgerufen und einem View-Controller mitgeteilt, dass der Benutzer authentifiziert ist, mit dem Aufbau des Hauptbildschirms begonnen, der eine Registerkartenleiste zu instanziieren schien, während er sich noch im Hintergrund-Thread befand, und dort befindet sich der Haupt-Thread-Prüfer arbeitete, also grub ich aus und fand heraus, dass der Delegierte, der nicht im Haupt-Thread angerufen wird, das Problem ist
Laurynas Letkauskas
17

Haben Sie Google-Anzeigen in Ihrer App aktiviert? Es könnte dann ein Fehler in Google Ads SDK oder ein Fehler in der WebKit SDK-Implementierung unter iOS 13 sein. (Sry kann ich nicht kommentieren, daher poste ich dies als Antwort.)

Huckepack davon - Beim Lesen des oben verlinkten Threads besteht die "offizielle" Lösung des Google Ads-Teams ab dem 19. November 2019 darin, die Liste Ihrer App so zu ändern, dass sie den folgenden Schlüssel / das folgende Paar enthält, um wkwebview anstelle von uiwebview zu verwenden.

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

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

own2pwn
quelle
Danke deine Antwort. Ich habe keine Google-Anzeigen in meiner App, aber ich habe eine UIWebView darin, aber UIWebView ist ein Teil von UIKit, nicht von WebKit.
bemul12
Verwenden Sie UIWebView oder WKWebview?
own2pwn
2
Gleiches Problem hier. Ich warte immer noch auf ein neues Update von Google. In der aktuellen Version (7.52.0) ist dieser Fehler weiterhin vorhanden.
fdlr
1
@nab Möglicherweise ja. Ein Entwickler meldete einen Umsatzverlust und führte an, dass die "Show Rate" um ~ 10% gesunken sei. Groups.google.com/d/msg/google-admob-ads-sdk/PuHOKMX1mVI/… und ein anderer berichtete einen Rückgang des Prozentsatzes der "Show Rate": Gruppen .google.com / d / msg / google-admob-ads-sdk / PuHOKMX1mVI /…
262 Hz
1
Hier ist die "offizielle" Lösung von Google: groups.google.com/forum/#!category-topic/google-admob-ads-sdk/…. Beachten Sie jedoch, dass ein Problem bekannt ist: Anzeigen mit Sound spielen den Sound IMMER ab , unabhängig davon des Vibrationsschalters eingeschaltet.
262 Hz
6

Dieses Problem kann auf das Google Ads SDK (7.5XX + iOS13) zurückzuführen sein, das diesen Thread gefunden hat .

Entwickler haben versucht, den Info.plistvom Google Ads-Team vorgeschlagenen Wert für Schlüsselpaare in der Datei zu verwenden.

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

Dieser verringerte Absturz führt jedoch zu einem weiteren Einfrierproblem (100% CPU-Auslastung).

Kürzlich hat Google 7.55.0 mit einem Hinweis veröffentlicht:

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

Versuchen Sie daher, das Google Ads SDK auf zu aktualisieren 7.55.0

arisch
quelle
3

Um Stapelspuren für Ihre Threads anzuzeigen, muss Crashlytics nach dem Absturz Code ausführen. Da dieser Code in einem der Threads Ihrer App ausgeführt wird, erfasst Crashlytics im Rahmen dieses Prozesses immer Informationen über die eigene Ausführung. Sie sehen immer einen Thread, der die Funktion "CLSProcessRecordAllThreads" ausführt. In der Tat werden Sie es aufgrund einer Compiler-Optimierung namens Inlining mehr als einmal sehen. Geben Sie hier die Bildbeschreibung ein Ausnahmen erhöhen die Komplexität zusätzlich. Wenn eine Objective-C- oder C ++ - Ausnahme nicht erfasst wird, zeichnet Crashlytics einige Informationen darüber auf, bevor die App beendet werden darf. In diesem Fall muss die Funktion CLSProcessRecordAllThreads für den Thread ausgeführt werden, der die Ausnahme ausgelöst hat. Dies bedeutet, dass im Falle einer Ausnahme der "abstürzende" Thread immer so aussieht, als würde er Crashlytics-Code ausführen. Dies ist normal und nur ein Artefakt dafür, wie wir die Stapelspuren zum Zeitpunkt der Ausnahme erfassen und präsentieren.

Zubair
quelle
1
Wie bestimmen Sie den tatsächlichen abstürzenden Thread, da "der abstürzende Thread immer so aussieht, als würde er Crashlytics-Code ausführen"?
wilc0