iOS 14.6/14.7 上的应用崩溃"AttributeGraph propagate_dirty"



我最近收到了一些崩溃报告。对我来说,这份报告没有太多的信息来寻找这个问题。崩溃报告目前只出现在iOS 14.6和14.7上,但我无法在我的设备/模拟器上复制它们(尤其是因为我不知道在哪里搜索问题(

Date/Time:           2021-07-29 22:14:50.9666 -0700
Launch Time:         2021-07-29 22:14:46.3294 -0700
OS Version:          iPhone OS 14.7.1 (18G82)
Release Type:        User
Baseband Version:    1.80.02
Report Version:      104
Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_PROTECTION_FAILURE at 0x000000016fafbff0
VM Region Info: 0x16fafbff0 is in 0x16faf8000-0x16fafc000;  bytes after start: 16368  bytes before end: 15
REGION TYPE                 START - END      [ VSIZE] PRT/MAX SHRMOD  REGION DETAIL
MALLOC_TINY              119c00000-119d00000 [ 1024K] rw-/rwx SM=PRV  
GAP OF 0x55df8000 BYTES
--->  STACK GUARD              16faf8000-16fafc000 [   16K] ---/rwx SM=NUL  ... for thread 0
Stack                    16fafc000-16fbf8000 [ 1008K] rw-/rwx SM=PRV  thread 0
Termination Signal: Segmentation fault: 11
Termination Reason: Namespace SIGNAL, Code 0xb
Terminating Process: exc handler [4037]
Triggered by Thread:  0
Thread 0 name:
Thread 0 Crashed:
0   libsystem_pthread.dylib         0x00000001f166d75c thread_start + 12
1   AttributeGraph                  0x00000001cef86234 AG::Graph::propagate_dirty(AG::AttributeID) + 368 (ag-graph-update.cc:191)
2   SwiftUI                         0x00000001ac8574a4 StoredLocationBase.beginUpdate() + 368 (StoredLocation.swift:94)
3   SwiftUI                         0x00000001ac857308 StoredLocationBase.BeginUpdate.apply() + 36 (StoredLocation.swift:78)
4   SwiftUI                         0x00000001ac83310c AsyncTransaction.apply() + 188 (GraphHost.swift:656)
5   SwiftUI                         0x00000001ac833008 GraphHost.runTransaction(_:) + 84 (GraphHost.swift:470)
6   SwiftUI                         0x00000001ac831880 GraphHost.flushTransactions() + 168 (GraphHost.swift:459)
7   SwiftUI                         0x00000001ac2e2008 thunk for @escaping @callee_guaranteed () -> () + 28 (<compiler-generated>:0)
8   SwiftUI                         0x00000001ac77c520 closure #1 in ViewRendererHost.render(interval:updateDisplayList:) + 1100 (<compiler-generated>:0)
9   SwiftUI                         0x00000001ac772c0c ViewRendererHost.render(interval:updateDisplayList:) + 308 (ViewRendererHost.swift:0)
10  SwiftUI                         0x00000001ac90ea78 _UIHostingView.displayLinkTimer(timestamp:) + 196 (UIHostingView.swift:1571)
11  SwiftUI                         0x00000001ac187fac DisplayLink.displayLinkTimer(_:) + 100 (_UIHostingView.swift:464)
12  SwiftUI                         0x00000001ac188014 @objc DisplayLink.displayLinkTimer(_:) + 44 (<compiler-generated>:0)
13  QuartzCore                      0x00000001a8b407b8 CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 672 (CADisplay.mm:2646)
14  QuartzCore                      0x00000001a8c1f7f4 display_timer_callback(__CFMachPort*, void*, long, void*) + 280 (CADisplayTimer.cpp:166)
15  CoreFoundation                  0x00000001a582fa0c __CFMachPortPerform + 176 (CFMachPort.c:537)
16  CoreFoundation                  0x00000001a585521c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 60 (CFRunLoop.c:1991)
17  CoreFoundation                  0x00000001a585459c __CFRunLoopDoSource1 + 596 (CFRunLoop.c:2131)
18  CoreFoundation                  0x00000001a584e180 __CFRunLoopRun + 2372 (CFRunLoop.c:3146)
19  CoreFoundation                  0x00000001a584d308 CFRunLoopRunSpecific + 600 (CFRunLoop.c:3242)
20  GraphicsServices                0x00000001bced0734 GSEventRunModal + 164 (GSEvent.c:2259)
21  UIKitCore                       0x00000001a82cb75c -[UIApplication _run] + 1072 (UIApplication.m:3269)
22  UIKitCore                       0x00000001a82d0fcc UIApplicationMain + 168 (UIApplication.m:4740)
23  SwiftUI                         0x00000001ac7b8380 closure #1 in KitRendererCommon(_:) + 112 (UIKitApp.swift:34)
24  SwiftUI                         0x00000001ac7b830c runApp<A>(_:) + 224 (<compiler-generated>:0)
25  SwiftUI                         0x00000001ac2b0b38 static App.main() + 144 (App.swift:113)
26  MyApp                           0x000000010020e9e8 $main + 24 (<compiler-generated>:3)
27  MyApp                           0x000000010020e9e8 main + 36 (GameCenterLogin.swift:0)
28  libdyld.dylib                   0x00000001a5509cf8 start + 4

GameCenterLogin是我的SwiftUI应用程序中的UIViewControllerRepresentable,用于登录GameCenter。最后一行中的main是否意味着崩溃出现在应用程序的开头?

我的主要方法如下:

import SwiftUI
@main
struct MyLittleApp: App {

var preferences = Preferences(UserDefaults.standard)
var purchaseManager: PurchaseManager

init() {
#if DEBUG
if ProcessInfo.processInfo.environment["enable-testing"] != nil {
let time = ProcessInfo.processInfo.environment["time"] ?? "0"
preferences.time = Int(time)!
UIView.setAnimationsEnabled(false)
}
#endif
purchaseManager = PurchaseManager(preferences: preferences)
}

var body: some Scene {
WindowGroup {
MainMenu()
.environmentObject(preferences)
.environmentObject(purchaseManager)
}
}
}

这可能是iOS 14.6/14.7中的一个错误吗?如果是:有办法解决这个问题吗?如果没有:有没有办法让我获得更多关于坠机的信息?或者有人知道问题出在哪里吗?

如果这很重要的话,我有Xcode 12.5.1,但我也没能在Xcode 13 Beta上复制它。

我无法完全帮助您指出这里的确切问题,但我可以为您做一些事情。

识别问题

EXC_BAD_ACCESS (SIGSEGV)->表示应用程序以意外方式使用某些内存时发生的内存访问问题导致的崩溃。

这次崩溃的原因主要是

取消引用指向无效内存地址的指针、写入只读内存或跳转到无效地址的指令。

日志中指出的主要问题是

KERN_PROTECTION_FAILURE

取消引用的存储器地址是0x000000016fafbff0,包含该存储器地址的区域由箭头标识。

地址位于一个称为堆栈保护的特殊内存区域中,堆栈保护是一个内存区域,用于缓冲一个线程的堆栈和另一个线程堆栈。

PRT列显示了内存区域的当前权限属性,其中r表示内存可读,w表示内存可写,x表示内存可执行。

由于堆栈保护区域没有权限,因此对该区域的所有内存访问都是无效的,并且崩溃报告将此内存访问标识为违反内存保护属性。堆栈保护只是受保护内存的一个例子——还有其他类型的受保护内存区域,具有不同的保护属性组合。

这意味着我们必须寻找内存访问问题发生的线索

由于回溯没有显示:

objc_msgSend、objc_retain或objc_release位于回溯顶部,崩溃不是由僵尸对象引起的。

我们在回溯的顶部也没有gpus_ReturnNotPermittedKillClient,这意味着OpenGL ES 没有问题

由于这两个崩溃都不存在,找到崩溃原因的可能性很小。

由于内存访问问题的原因不在回溯中。意外修改内存位置时发生内存损坏。修改后,您的应用程序的另一部分在尝试使用该内存位置时崩溃。回溯显示访问修改后的内存的代码,但不显示意外修改内存的代码意外的修改可能发生在崩溃前很长一段时间,因此在回溯中看不到问题的来源

如果您有许多带有内存访问问题迹象的崩溃报告,但具有不同的回溯,则可能存在内存损坏问题。

使用Xcode调查崩溃

你不必使用Xcode来继续你的调查。Xcode包含一套调试工具,您可以在应用程序运行时使用这些工具来识别内存访问问题。
  • 地址消毒器
  • 未定义的行为消毒器
  • 线程消毒器

如果您的应用程序包含Objectice-C、C或C++中的代码,请运行静态分析器,并修复它发现的所有问题。静态分析器在构建时分析应用程序的代码,并识别常见的编程错误,包括某些类型的内存管理问题。

您必须使用malloc调试功能,如Guard malloc来识别内存问题,因为它很难诊断。您可以通过Xcode方案编辑器启用这些工具,如使用消毒剂运行应用程序、API检查和内存管理诊断所述。

相关内容

  • 没有找到相关文章

最新更新