El subproceso Crashlytics se bloqueó solo en iOS13 construido con Xcode11

18

Mi aplicación se bloquea solo en iOS13 con la siguiente pila de llamadas:

#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

No tengo ni idea de qué puede ocurrir este problema y cómo puedo reproducirlo. Se bloquea al azar. Yo uso Crashlytics v3.14 en mi proyecto. ¿Alguien se enfrenta con el mismo problema?

bemul12
fuente
1
¿Todavía tiene este problema
Anjula S.

Respuestas:

9

En primer lugar, recomendaría activar el "Comprobador de subprocesos principales", en Xcode, vaya a Producto -> Esquema -> Editar esquema -> Diagnóstico, debería ver esta ventana Pestaña Diagnóstico Otra cosa que podría intentar es ir a la sección de su punto de interrupción en Xcode y haga clic en el signo + y agregue un punto de interrupción simbólico, que escuchará en una llamada específica y puede agregarle una condición para verificar si se llama en el hilo principal.

Un punto de quiebre simbólico

Si encuentra su error en el código, publíquelo aquí, ya que estoy experimentando el mismo bloqueo que usted en mi aplicación, así que esto es lo más lejos que he llegado para descubrir el error. Espero que te ayude!

Laurynas Letkauskas
fuente
He intentado esta sugerencia, pero desafortunadamente no pude ver el accidente.
bemul12
Mi problema estaba en la autorización local (Touch ID, Face ID), estaba presentando otro controlador de vista en un hilo de fondo y mi aplicación se bloqueó más tarde después de usar la aplicación durante unos 2 minutos al azar. Podrías intentar comprobarlo
Laurynas Letkauskas
Si entiendo correctamente, su problema fue detectado por el verificador de hilos principal y lo encontró en la sección de advertencias de tiempo de ejecución. Verifiqué muchos flujos en mi aplicación y no recibí advertencias de tiempo de ejecución por el verificador de subprocesos principales.
bemul12
No fue exactamente en el cierre de la autenticación. En realidad, estaba llamando a un método de delegado desde el cierre, diciéndole a un controlador de vista que el usuario está autenticado, comenzó a construir la pantalla principal, que parecía crear una barra de pestañas mientras aún estaba en el hilo de fondo, y ahí es donde el verificador de hilo principal funcionó, así que desenterré y descubrí que el delegado que se llama no en el hilo principal es el problema
Laurynas Letkauskas
17

¿Tiene habilitados los anuncios de Google en su aplicación? Entonces podría ser un error en el SDK de anuncios de Google o un error en la implementación del SDK de WebKit en iOS 13. (Sry no puedo comentar, así que publico esto como respuesta)

Aprovechando esto: leyendo el hilo vinculado anterior, la solución "oficial" del equipo de Google Ads a partir del 19 de noviembre de 2019 es modificar la lista de su aplicación para incluir la siguiente clave / par para usar wkwebview en lugar de uiwebview.

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

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

own2pwn
fuente
Gracias tu respuesta. No tengo anuncios de Google en mi aplicación, pero tengo un UIWebView dentro, pero UIWebView es parte de UIKit, no de WebKit.
bemul12
¿Utiliza UIWebView o WKWebview?
own2pwn
2
Mismo problema aquí. Todavía estoy esperando una nueva actualización de Google. En la versión actual (7.52.0) este error aún existe.
fdlr
1
@nab Posiblemente, sí. Un desarrollador reportó pérdida de ingresos, citando que la "tasa de presentación" cayó ~ 10% groups.google.com/d/msg/google-admob-ads-sdk/PuHOKMX1mVI/… Y otra disminución reportada en el porcentaje de "tasa de presentación": grupos .google.com / d / msg / google-admob-ads-sdk / PuHOKMX1mVI / ...
262Hz
1
Aquí está la solución "oficial" de Google: groups.google.com/forum/#!category-topic/google-admob-ads-sdk/… pero tenga en cuenta que hay un problema conocido: los anuncios con sonido SIEMPRE reproducirán el sonido, independientemente del interruptor de vibración encendido.
262Hz
6

Este problema podría deberse al SDK de anuncios de Google (7.5XX + iOS13), encontró este hilo .

Los desarrolladores intentaron usar el valor de par de claves por debajo del Info.plistarchivo, como lo sugirió el equipo de Google Ads.

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

Esto disminuyó el bloqueo, pero esto está dando otro problema de congelación (100% de uso de la CPU).

Recientemente Google lanzó 7.55.0 con una nota:

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

intente actualizar el SDK de anuncios de Google a 7.55.0

ario
fuente
3

Para mostrar los rastros de la pila de sus hilos, Crashlytics necesita ejecutar algún código después del bloqueo. Debido a que este código se está ejecutando en uno de los hilos de su aplicación, Crashlytics siempre captura información sobre su propia ejecución como parte de este proceso. Siempre verá un subproceso que ejecuta la función "CLSProcessRecordAllThreads". De hecho, lo verá más de una vez, debido a una optimización del compilador llamada inlining. ingrese la descripción de la imagen aquí Las excepciones agregan un poco más de complejidad. Cuando una excepción Objective-C o C ++ no se detecta, Crashlytics registra cierta información al respecto antes de que la aplicación pueda finalizar. Cuando esto sucede, la función CLSProcessRecordAllThreads debe ejecutarse en el subproceso que generó la excepción. Esto significa que en el caso de una excepción, el hilo de "bloqueo" siempre se verá como si estuviera ejecutando el código Crashlytics. Esto es normal y es solo un artefacto de cómo capturamos y presentamos los rastros de la pila en el momento de la excepción.

Zubair
fuente
1
Dado que "el hilo que falla siempre se verá como si estuviera ejecutando el código Crashlytics", ¿cómo determina cuál es el hilo que falla?
wilc0