O tópico Crashlytics travou apenas no iOS13, construído com o Xcode11

18

Meu aplicativo travou apenas no iOS13 com a seguinte pilha de chamadas:

#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

Eu absolutamente não tenho nenhuma idéia, o que pode ocorrer esse problema e como posso me reproduzir. Falha aleatoriamente. Eu uso o Crashlytics v3.14 no meu projeto. Alguém enfrenta o mesmo problema?

bemul12
fonte
11
Você ainda tem esse problema
Anjula S.

Respostas:

9

Antes de tudo, eu recomendaria ativar o "Main Thread Checker", no Xcode, vá para Produto -> Esquema -> Editar esquema -> Diagnósticos, você deve ver esta janela Guia Diagnóstico Outra coisa que você pode tentar é acessar a seção de ponto de interrupção em Xcode e clicando no sinal + e adicionando um ponto de interrupção simbólico, que ouvirá uma chamada específica e você poderá adicionar uma condição para verificar se ela é chamada no encadeamento principal.

Um ponto de interrupção simbólico

Se você encontrar seu bug no código, poste-o aqui, pois estou enfrentando o mesmo travamento que você no meu aplicativo, portanto, isso é o mais longe que eu descobri o bug. Espero que te ajude!

Laurynas Letkauskas
fonte
Eu tentei essa sugestão, mas infelizmente não peguei o acidente.
bemul12
Meu problema estava na autorização local (touch ID, face ID), eu estava apresentando outro controlador de exibição em um encadeamento em segundo plano e meu aplicativo travou apenas mais tarde depois de usá-lo por cerca de 2 minutos aleatoriamente. Você poderia tentar verificar isso #
Laurynas Letkauskas
Se eu entendi corretamente, seu problema foi detectado pelo verificador principal de threads e você o encontrou na seção de avisos de tempo de execução. Eu verifiquei muitos fluxos no meu aplicativo e não recebi avisos de tempo de execução pelo verificador de thread principal.
Bem
Não foi exatamente no fechamento da autenticação. Na verdade, eu estava chamando um método delegado a partir do fechamento, dizendo a um controlador de exibição que o usuário é autenticado, comece a construir a tela principal, que parecia instanciar uma barra de guias enquanto ainda estava no encadeamento em segundo plano, e é aí que o verificador de encadeamento principal trabalhou, então eu cavei para baixo e descobriu que delegado que está sendo chamado não no segmento principal é a questão
Laurynas Letkauskas
17

Você tem anúncios do google ativados no seu aplicativo? Em seguida, poderia ser um erro no Google ads sdk ou na implementação do WebKit SDK no iOS 13. (sry, não posso comentar, por isso posto isso como resposta)

Pegando carona com isso - lendo o segmento vinculado acima, a solução "oficial" da equipe do Google Ads a partir de 19 de novembro de 2019 é modificar a lista de pedidos do seu aplicativo para incluir a seguinte chave / par para usar wkwebview em vez de uiwebview.

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

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

own2pwn
fonte
Obrigado sua resposta. Não tenho anúncios do Google no meu aplicativo, mas tenho um UIWebView nele, mas o UIWebView faz parte do UIKit, não do WebKit.
bemul12
Você usa o UIWebView ou o WKWebview?
own2pwn
2
O mesmo problema aqui. Ainda estou esperando uma nova atualização do Google. Na versão atual (7.52.0) esse erro ainda existe.
Fdlr 27/11/19
11
@nab Possivelmente sim. Um desenvolvedor relatou perda de receita, citando que a "taxa de exibição" caiu ~ 10% groups.google.com/d/msg/google-admob-ads-sdk/PuHOKMX1mVI/… E outra redução relatada na porcentagem de "taxa de exibição": groups .google.com / d / msg / google-admob-ads-sdk / PuHOKMX1mVI /…
262Hz 31/12/1919
11
Aqui está a solução "oficial" do Google: groups.google.com/forum/#!category-topic/google-admob-ads-sdk/…, mas observe que há um problema conhecido: anúncios com som SEMPRE reproduzirão o som, independentemente do interruptor vibratório ligado.
262Hz 31/12/19
6

Esse problema pode ser devido ao SDK dos anúncios do Google (7.5XX + iOS13), encontrado neste tópico .

Os desenvolvedores tentaram usar o valor abaixo do par de chaves no Info.plistarquivo, conforme sugerido pela equipe do Google Ads.

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

Isso diminuiu a falha, mas está causando outro problema de congelamento (100% de uso da CPU).

Recentemente, o Google lançou o 7.55.0 com uma nota:

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

tente atualizar o SDK dos anúncios do Google para 7.55.0

Ariano
fonte
3

Para mostrar rastreamentos de pilha para seus threads, o Crashlytics precisa executar algum código após o travamento. Como esse código está sendo executado em um dos threads do seu aplicativo, o Crashlytics sempre captura informações sobre sua própria execução como parte desse processo. Você sempre verá um encadeamento executando a função “CLSProcessRecordAllThreads”. De fato, você verá mais de uma vez, devido a uma otimização do compilador chamada inlining. insira a descrição da imagem aqui Exceções adicionam um pouco mais de complexidade. Quando uma exceção Objective-C ou C ++ não é capturada, o Crashlytics registra algumas informações sobre ele antes que o aplicativo possa terminar. Quando isso acontece, a função CLSProcessRecordAllThreads deve ser executada no encadeamento que lançou a exceção. Isso significa que, no caso de uma exceção, o segmento "travando" sempre parecerá estar executando o código Crashlytics. Isso é normal e é apenas um artefato de como capturamos e apresentamos os rastreamentos de pilha no momento da exceção.

Zubair
fonte
11
Como o "encadeamento com falha sempre parecerá estar executando o código Crashlytics", como você determina qual é o encadeamento com falha real?
wilc0