我最近收到了一些崩溃报告。对我来说,这份报告没有太多的信息来寻找这个问题。崩溃报告目前只出现在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检查和内存管理诊断所述。