Сбой потока Crashlytics только на iOS13, построенной с Xcode11

18

Мое приложение падает только на iOS13 со следующим стеком вызовов:

#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

Я абсолютно не знаю, что может вызвать эту проблему и как я могу воспроизвести. Вылетает случайно. Я использую Crashlytics v3.14 в моем проекте. Кто-нибудь сталкивается с такой же проблемой?

bemul12
источник
1
У вас все еще есть эта проблема
Anjula S.

Ответы:

9

Прежде всего, я бы порекомендовал включить «Проверка основного потока», в XCode, перейдите в «Продукт» -> «Схема -> Редактировать схему -> Диагностика», вы должны увидеть это окно. Вкладка «Диагностика» Еще одна вещь, которую вы можете попробовать - перейти в раздел «Точка останова» в Сделайте Xcode и нажмите знак + и добавьте символическую точку останова, которая будет прослушивать конкретный вызов, и вы можете добавить к нему условие для проверки, вызывается ли он в главном потоке.

Символическая точка останова

Если вам случится найти вашу ошибку в коде, пожалуйста, опубликуйте ее здесь, так как я испытываю тот же сбой, что и вы, в моем приложении, так что это то, что я дошел до обнаружения ошибки. Надеюсь, это поможет вам!

Лауринас Леткаускас
источник
Я попробовал это предложение, но, к сожалению, я не поймал аварию.
bemul12
Моя проблема была в локальной авторизации (Touch ID, Face ID), я представлял другой контроллер представления в фоновом потоке, и мое приложение зависало только позже после случайного использования приложения в течение примерно 2 минут в случайном порядке. Вы можете попробовать это проверить
Лауринас Леткаускас
Если я правильно понимаю, ваша проблема была обнаружена программой проверки основного потока, и вы нашли ее в разделе предупреждений времени выполнения. Я проверил много потоков в моем приложении, и я не получил предупреждения времени выполнения основной проверкой потока.
bemul12
Это было не совсем в закрытии аутентификации. Я на самом деле вызывал метод делегата из замыкания, сообщая контроллеру представления, что пользователь аутентифицирован, начинаю создавать главный экран, который, казалось, создает экземпляр панели вкладок, пока он еще находится в фоновом потоке, и именно здесь проверяется основной поток сработало, поэтому я покопался и обнаружил, что проблема
вызвана
17

В вашем приложении включены объявления Google? Тогда это может быть ошибка в Google ads sdk или ошибка в реализации WebKit SDK на iOS 13. (извините, я не могу комментировать, поэтому я публикую это как ответ)

Взаимодействие с этим - если вы читаете вышеупомянутую связанную ветку, «официальное» решение команды Google Ads по состоянию на 19 ноября 2019 года состоит в том, чтобы изменить plist вашего приложения, добавив в него следующий ключ / пару, чтобы использовать wkwebview вместо uiwebview.

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

Источник: https://groups.google.com/forum/#!category-topic/google-admob-ads-sdk/ios/I4EEWrPPbSc

own2pwn
источник
Спасибо за ваш ответ. У меня нет рекламы Google в моем приложении, но у меня есть UIWebView внутри него, но UIWebView является частью UIKit, а не WebKit.
bemul12
Вы используете UIWebView или WKWebview?
own2pwn
2
Та же проблема здесь. Я все еще жду нового обновления от Google. В текущей версии (7.52.0) эта ошибка все еще существует.
FDLR
1
@nab Возможно, да. Один разработчик сообщил о потере дохода, сославшись на то, что «показатель показа» упал на ~ 10% groups.google.com/d/msg/google-admob-ads-sdk/PuHOKMX1mVI/… И еще один сообщил об уменьшении процента «показатель показа»: группы .google.com / d / msg / google-admob-ads-sdk / PuHOKMX1mVI /…
262 Гц,
1
Вот «официальное» решение от Google: groups.google.com/forum/#!category-topic/google-admob-ads-sdk/… но учтите, что есть одна известная проблема: реклама со звуком ВСЕГДА воспроизводит звук независимо от того, вибрационный выключатель, который включен.
262 Гц,
6

Эта проблема может быть связана с SDK объявлений Google (7.5XX + iOS13), найденным в этой теме .

Разработчики постарались использовать приведенное ниже значение пары ключей в Info.plistфайле, как это было предложено командой Google Ads.

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

Это уменьшило аварийное завершение, но это вызывает еще одну проблему зависания (100% загрузки процессора).

Недавно Google выпустил 7.55.0 с примечанием:

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

поэтому попробуйте обновить SDK Google Ads до 7.55.0

арийский
источник
3

Чтобы показать трассировки стека для ваших потоков, Crashlytics должен выполнить некоторый код после сбоя. Поскольку этот код выполняется в одном из потоков вашего приложения, Crashlytics всегда собирает информацию о своем собственном выполнении как часть этого процесса. Вы всегда увидите поток, выполняющий функцию «CLSProcessRecordAllThreads». Фактически, вы увидите это более одного раза благодаря оптимизации компилятора, называемой встраиванием. введите описание изображения здесь Исключения добавляют дополнительную сложность. Когда исключение Objective-C или C ++ остается необработанным, Crashlytics записывает некоторую информацию о нем, прежде чем приложению будет разрешено завершить работу. Когда это происходит, функция CLSProcessRecordAllThreads должна запускаться в потоке, выдавшем исключение. Это означает, что в случае исключения «сбойный» поток всегда будет выглядеть так, как будто он выполняет код Crashlytics. Это нормально и является просто артефактом того, как мы собираем и представляем трассировки стека во время исключения.

Зубайр
источник
1
Поскольку «аварийный поток всегда будет выглядеть так, как если бы он выполнял код Crashlytics», как определить, что представляет собой настоящий аварийный поток?
wilc0