Crashlytics 线程仅在使用 Xcode 11 构建的 iOS 13 上崩溃

Posted

技术标签:

【中文标题】Crashlytics 线程仅在使用 Xcode 11 构建的 iOS 13 上崩溃【英文标题】:Crashlytics thread crashed only on iOS13 built with Xcode11 【发布时间】:2019-10-15 11:08:40 【问题描述】:

我的应用仅在 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。有人遇到同样的问题吗?

【问题讨论】:

你还有这个问题吗 【参考方案1】:

您的应用中是否启用了谷歌广告?那么它可能是Google ads sdk 中的一个错误,或者是 iOS 13 上 WebKit SDK 实现中的一个错误。(抱歉,我无法发表评论,所以我将其发布为答案)

捎带这一点 - 通读上面链接的线程,截至 2019 年 11 月 19 日,Google Ads 团队的“官方”解决方案是修改您应用的 plist 以包含以下密钥/对以使用 wkwebview 而不是 uiwebview。

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

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

【讨论】:

感谢您的回答。我的应用中没有 Google 广告,但里面有 UIWebView,但 UIWebView 是 UIKit 的一部分,而不是 WebKit。 你用的是 UIWebView 还是 WKWebview? 这里有同样的问题。我仍在等待 Google 的新更新。在当前版本(7.52.0)中,这个错误仍然存​​在。 @nab 可能,是的。一位开发商报告收入损失,称“显示率”下降了约 10% groups.google.com/d/msg/google-admob-ads-sdk/PuHOKMX1mVI/… 另一个报告“显示率”百分比下降:groups.google.com/d/msg/google-admob-ads-sdk/PuHOKMX1mVI/… 这是来自 Google 的“官方”解决方案:groups.google.com/forum/#!category-topic/google-admob-ads-sdk/… 但请注意有一个已知问题:有声音的广告将始终播放声音,无论是否打开了振动开关。【参考方案2】:

首先我建议打开“主线程检查器”,在 Xcode 中,转到 Product -> Scheme -> Edit scheme -> Diagnostics,你应该会看到这个窗口 你可以尝试的另一件事是转到 Xcode 中的断点部分并单击 + 号并添加一个符号断点,它将侦听特定调用,您可以为其添加条件以检查它是否在主线程上被调用。

如果您碰巧在代码中发现了错误,请在此处发布,因为我在应用程序中遇到了与您相同的崩溃,所以这就是我找出错误的地方。希望对你有所帮助!

【讨论】:

我已经尝试过这个建议,但不幸的是我没有遇到崩溃。 我的问题在于本地授权(触摸 ID、面部 ID),我在后台线程上呈现另一个视图控制器,我的应用程序在随机使用该应用程序约 2 分钟后才崩溃。你可以试试看 如果我理解正确,您的问题已被主线程检查器发现,您在运行时警告部分找到了它。我在我的应用程序中检查了很多流程,但主线程检查器没有收到运行时警告。 它不完全是在身份验证的关闭中。我实际上是从闭包中调用一个委托方法,告诉视图控制器用户已通过身份验证,开始构建主屏幕,这似乎在仍在后台线程上时实例化了一个选项卡栏,这就是主线程检查器工作,所以我挖掘并发现不是在主线程上调用委托是问题【参考方案3】:

这个问题可能是由于谷歌广告 SDK(7.5X.X + iOS13),发现这个thread。

按照 Google Ads 团队的建议,开发人员尝试在 Info.plist 文件中使用以下密钥对值。

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

这减少了崩溃,但这又带来了另一个冻结问题(100% CPU 使用率)。

最近 Google 发布了 7.55.0 并附注:

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

所以尝试将 Google 广告 SDK 更新为 7.55.0

【讨论】:

【参考方案4】:

为了显示线程的堆栈跟踪,Crashlytics 需要在崩溃后运行一些代码。由于此代码在您的应用程序的一个线程上执行,因此 Crashlytics 始终捕获有关其自身执行的信息作为此过程的一部分。您将始终看到执行“CLSProcessRecordAllThreads”函数的线程。实际上,由于称为内联的编译器优化,您会不止一次看到它。 异常增加了一点复杂性。当 Objective-C 或 C++ 异常未被捕获时,Crashlytics 会在应用程序被允许终止之前记录一些有关它的信息。发生这种情况时,必须在引发异常的线程上运行 CLSProcessRecordAllThreads 函数。这意味着在发生异常的情况下,“崩溃”线程将始终看起来像是在运行 Crashlytics 代码。这是正常的,只是我们在异常时如何捕获和呈现堆栈跟踪的人工产物。

【讨论】:

既然“崩溃的线程总是看起来像是在运行 Crashlytics 代码”,那么如何确定实际崩溃的线程是什么? 我也遇到了错误,请找到给定的 crashlytics stacktrace 如果有人知道原因和修复方法,请帮忙,一个多星期,我想不通。我很沮丧,现在很头疼Stacktrace: https://i.stack.imgur.com/xszZY.jpg【参考方案5】:

Google-Mobile-Ads-SDK 8.8 版和 iOS 14.x 仍然存在这种情况吗?

gad_preferred_webview wkwebview 添加到 info.plist 只是减少了我的应用程序中的错误数量,但仍然没有完全消失。

CoreAutoLayout: _AssertAutoLayoutOnAllowedThreadsOnly

在某些设备上仍会发生(约占总用户的 5%),甚至 GADBannerView 也只能从 DispatchQueue.main.async 创建和访问

【讨论】:

以上是关于Crashlytics 线程仅在使用 Xcode 11 构建的 iOS 13 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Fabric/Crashlytics NoClassDefFoundError 仅在某些设备上

Xcode 10b5 - 重复符号链接器错误,无法使用 Crashlytics 编译

Firebase Crashlytics 仅在通过 USB 部署时有效

如何在使用 Xcode 自动代码签名的同时使用 Fastlane 和 Crashlytics 进行构建?

在 Xcode 上更改 Firebase Crashlytics 的捆绑包 ID

Xcode 7.1 中 ios 的 Crashlytics,在 xcode 7 中添加框架后抛出多个错误