Crashlytics线程仅在使用Xcode11构建的iOS13上崩溃

21

我的应用程序仅在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
你还有这个问题吗? - Anjula Serasinghe
5个回答

18

您的应用中是否启用了Google广告?这可能是Google广告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


1
谢谢你的回答。我的应用程序中没有Google广告,但我在其中有一个UIWebView,但UIWebView是UIKit的一部分,而不是WebKit。 - bemul12
2
这里也有同样的问题。我仍在等待Google的新更新。在当前版本(7.52.0)中,这个错误仍然存在。 - fdlr
这里发生的事情和7.53.1版本的发布说明并没有涉及到这个问题。 - Mike Flynn
1
@nab 可能是的。一位开发者报告称收入下降,引用“展示率”下降了约10% https://groups.google.com/d/msg/google-admob-ads-sdk/PuHOKMX1mVI/25HdNhRxBgAJ另一位开发者报告称“展示率”百分比下降:https://groups.google.com/d/msg/google-admob-ads-sdk/PuHOKMX1mVI/ScgCHMrLAAAJ - 262Hz
1
这是Google的“官方”解决方案:https://groups.google.com/forum/#!category-topic/google-admob-ads-sdk/ios/I4EEWrPPbSc,但请注意有一个已知问题:带声音的广告将始终播放声音,无论振动开关是否打开。 - 262Hz
显示剩余3条评论

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

A symbolic breakpoint

如果你在代码中发现了bug,请在此处发布,因为我在我的应用程序中遇到了与你相同的崩溃,所以这是我发现bug的限度。希望能对你有所帮助!


我尝试了这个建议,但不幸的是我没有捕捉到崩溃。 - bemul12
我的问题出在本地授权(Touch ID,Face ID)上,我在后台线程上呈现了另一个视图控制器,然后我的应用程序在随机使用约2分钟后才崩溃。你可以尝试检查一下这个问题。 - OldTimes
如果我理解正确的话,您的问题被主线程检查器捕获,并且您在运行时警告部分找到了它。我检查了我的应用程序中的许多流程,但没有通过主线程检查器获得运行时警告。 - bemul12
这并不完全是在认证的闭包中出现的问题。实际上,我是从闭包中调用了一个委托方法,告诉视图控制器用户已经通过身份验证,开始构建主屏幕,似乎在后台线程实例化了一个选项卡栏,这就是主线程检查器起作用的地方,所以我深入挖掘发现,调用非主线程的委托是问题所在。 - OldTimes

6
这个问题可能是由于谷歌广告SDK(7.5X.X + iOS13)引起的,找到了这个帖子。开发者尝试使用下面的键值对在Info.plist文件中,如Google广告团队所建议的。
<key>gad_preferred_webview</key>
<string>wkwebview</string>

这样做降低了崩溃率,但出现了另一个冻结问题(100% CPU使用率)。

最近谷歌发布了7.55.0版本,并附有一则说明:

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

因此,请尝试更新Google广告SDK至7.55.0


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

1
由于“崩溃线程看起来总是像在运行Crashlytics代码”,那么你如何确定实际的崩溃线程是什么? - johnny
我也遇到了这个错误,请查看给定的Crashlytics堆栈跟踪。如果有人知道原因和解决方法,请帮忙。已经过去一周了,我还是无法找出问题所在。我非常沮丧,现在已经成为一个头疼的问题。堆栈跟踪:https://i.stack.imgur.com/xszZY.jpg - Muhammad Owais

0
这在 Google-Mobile-Ads-SDK 版本 8.8 和 iOS 14.x 中仍然存在吗?
gad_preferred_webview wkwebview 添加到 info.plist 可以减少应用程序中的错误数量,但仍无法完全消除。
CoreAutoLayout: _AssertAutoLayoutOnAllowedThreadsOnly

仍然发生在某些设备上(约占总用户的5%),即使GADBannerView仅从DispatchQueue.main.async {}创建和访问


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接