SwiftUI 因一位用户的 EXC_BREAKPOINT (SIGTRAP) 而崩溃,我无法在模拟器中复制它

Posted

技术标签:

【中文标题】SwiftUI 因一位用户的 EXC_BREAKPOINT (SIGTRAP) 而崩溃,我无法在模拟器中复制它【英文标题】:SwiftUI crashing with EXC_BREAKPOINT (SIGTRAP) for one user and I can't replicate it in simulator 【发布时间】:2020-05-13 16:20:05 【问题描述】:

今年我自学了编码,终于开始通过 TestFlight 与一些朋友分享我的应用程序。我的一位朋友无法在应用程序中点击任何内容而不会崩溃,但我似乎无法在模拟器中复制该问题。这是崩溃日志:

Incident Identifier: 9C5CBC92-D799-4EF7-A0BD-B3D38BDFCD6A
Beta Identifier:     14981E01-C6E4-4340-A6C2-2C7730C5F39F
Hardware Model:      iPhone9,3
Process:             Skool [849]
Path:                /private/var/containers/Bundle/Application/CD824E3B-BB88-47D1-912E-55156C40187E/Skool.app/Skool
Identifier:          com.kevinolmats.Skool
Version:             2777 (0.2.2)
AppStoreTools:       11E503a
AppVariant:          1:iPhone9,3:13
Beta:                YES
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd [1]
Coalition:           com.kevinolmats.Skool [677]


Date/Time:           2020-05-09 10:19:43.2873 -0600
Launch Time:         2020-05-09 10:19:41.3463 -0600
OS Version:          iPhone OS 13.4.1 (17E262)
Release Type:        User
Baseband Version:    4.02.02
Report Version:      104

Exception Type:  EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x00000001becb85e0
Termination Signal: Trace/BPT trap: 5
Termination Reason: Namespace SIGNAL, Code 0x5
Terminating Process: exc handler [849]
Triggered by Thread:  0

Thread 0 name:
Thread 0 Crashed:
0   libswiftCore.dylib              0x00000001becb85e0 _assertionFailure(_:_:file:line:flags:) + 796 (AssertCommon.swift:132)
1   libswiftCore.dylib              0x00000001becb85e0 _assertionFailure(_:_:file:line:flags:) + 796 (AssertCommon.swift:132)
2   SwiftUI                         0x00000001e9394268 EnvironmentObject.error() + 216 (EnvironmentObject.swift:55)
3   Skool                           0x0000000104223228 CourseAssignmentsListView.body.getter + 2116 (CourseAssignmentsListView.swift:0)
4   SwiftUI                         0x00000001e8ef4a40 DynamicPropertyBody.update(context:) + 1788 (CustomView.swift:110)
5   SwiftUI                         0x00000001e8ef5040 protocol witness for static UntypedAttribute._update(_:graph:attribute:) in conformance DynamicPr... + 36 (<compiler-generated>:0)
6   AttributeGraph                  0x00000001dd21e998 partial apply + 28 (<compiler-generated>:0)
7   AttributeGraph                  0x00000001dd2079fc AG::Graph::UpdateStack::update() + 440 (ag-closure.h:104)
8   AttributeGraph                  0x00000001dd207eb4 AG::Graph::update_attribute(unsigned int, bool) + 372 (ag-graph-update.cc:399)
9   AttributeGraph                  0x00000001dd20b044 AG::Graph::value_ref(AG::attribute_t, AGTypeID, bool*) + 116 (ag-graph.cc:762)
10  AttributeGraph                  0x00000001dd218310 AGGraphGetValue + 48 (AGGraph.mm:304)
11  SwiftUI                         0x00000001e8ff59a0 ViewGraph.accessibilityNodes() + 108 (<compiler-generated>:0)
12  SwiftUI                         0x00000001e93adf08 specialized _UIHostingView.enableAccessibility() + 116
13  SwiftUI                         0x00000001e93a4aac specialized _UIHostingView.init(rootView:) + 2116 (UIHostingView.swift:1278)
14  SwiftUI                         0x00000001e93b3dc8 specialized UIHostingController.init(rootView:) + 56 (UIHostingView.swift:0)
15  SwiftUI                         0x00000001e933df74 specialized DestinationHostingController.__allocating_init(rootView:) + 56 (<compiler-generated>:0)
16  SwiftUI                         0x00000001e933dd2c NavigationBridge_PhoneTV.push(_:onto:animated:) + 76 (NavigationBridge_PhoneTV.swift:84)
17  SwiftUI                         0x00000001e8f83438 UIKitNavigationBridge.updatePresentedContent(_:animated:) + 204 (UIKitNavigationBridge.swift:168)
18  SwiftUI                         0x00000001e8f83844 UIKitNavigationBridge.preferencesDidChange(_:) + 372 (UIKitNavigationBridge.swift:203)
19  SwiftUI                         0x00000001e933d560 NavigationBridge_PhoneTV.preferencesDidChange(_:) + 44 (NavigationBridge_PhoneTV.swift:21)
20  SwiftUI                         0x00000001e8f26078 _UIHostingView.preferencesDidChange() + 476 (_UIHostingView.swift:199)
21  SwiftUI                         0x00000001e8ff3d74 ViewGraph.updateOutputs(at:) + 180 (ViewGraph.swift:652)
22  SwiftUI                         0x00000001e92928b4 closure #1 in closure #1 in ViewRendererHost.render(interval:updateDisplayList:) + 816 (ViewRendererHost.swift:157)
23  SwiftUI                         0x00000001e9291d54 closure #1 in ViewRendererHost.render(interval:updateDisplayList:) + 524 (ViewRendererHost.swift:145)
24  SwiftUI                         0x00000001e9288c5c ViewRendererHost.render(interval:updateDisplayList:) + 316 (ViewRendererHost.swift:132)
25  SwiftUI                         0x00000001e93aee50 _UIHostingView.displayLinkTimer(timestamp:) + 160 (UIHostingView.swift:1391)
26  SwiftUI                         0x00000001e8f26344 DisplayLink.displayLinkTimer(_:) + 88 (_UIHostingView.swift:270)
27  SwiftUI                         0x00000001e8f2639c @objc DisplayLink.displayLinkTimer(_:) + 40 (<compiler-generated>:0)
28  QuartzCore                      0x00000001b81c0368 CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 516 (CADisplay.mm:2528)
29  IOKit                           0x00000001b2751628 IODispatchCalloutFromCFMessage + 480 (IOKitLib.c:1239)
30  CoreFoundation                  0x00000001b1762bc0 __CFMachPortPerform + 172 (CFMachPort.c:533)
31  CoreFoundation                  0x00000001b178c200 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 56 (CFRunLoop.c:1937)
32  CoreFoundation                  0x00000001b178b90c __CFRunLoopDoSource1 + 444 (CFRunLoop.c:2075)
33  CoreFoundation                  0x00000001b17866c0 __CFRunLoopRun + 1888 (CFRunLoop.c:3098)
34  CoreFoundation                  0x00000001b1785c34 CFRunLoopRunSpecific + 424 (CFRunLoop.c:3192)
35  GraphicsServices                0x00000001bb8cf38c GSEventRunModal + 160 (GSEvent.c:2246)
36  UIKitCore                       0x00000001b58b822c UIApplicationMain + 1932 (UIApplication.m:4820)
37  Skool                           0x000000010417275c main + 68 (OverdueDashboardSubview.swift:13)
38  libdyld.dylib                   0x00000001b160d800 start + 4

Thread 1:
0   libsystem_pthread.dylib         0x00000001b1527738 start_wqthread + 0

Thread 2:
0   libsystem_pthread.dylib         0x00000001b1527738 start_wqthread + 0

Thread 3:
0   libsystem_pthread.dylib         0x00000001b1527738 start_wqthread + 0

Thread 4:
0   libsystem_pthread.dylib         0x00000001b1527738 start_wqthread + 0

Thread 5:
0   libsystem_pthread.dylib         0x00000001b1527738 start_wqthread + 0

Thread 6 name:
Thread 6:
0   libsystem_kernel.dylib          0x00000001b15e1198 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x00000001b15e060c mach_msg + 72 (mach_msg.c:103)
2   CoreFoundation                  0x00000001b178b3b4 __CFRunLoopServiceMachPort + 148 (CFRunLoop.c:2575)
3   CoreFoundation                  0x00000001b17863e8 __CFRunLoopRun + 1160 (CFRunLoop.c:2931)
4   CoreFoundation                  0x00000001b1785c34 CFRunLoopRunSpecific + 424 (CFRunLoop.c:3192)
5   Foundation                      0x00000001b1ac8bcc -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 228 (NSRunLoop.m:374)
6   Foundation                      0x00000001b1ac8aac -[NSRunLoop(NSRunLoop) runUntilDate:] + 88 (NSRunLoop.m:421)
7   UIKitCore                       0x00000001b595a160 -[UIEventFetcher threadMain] + 152 (UIEventFetcher.m:736)
8   Foundation                      0x00000001b1bf79d0 __NSThread__start__ + 848 (NSThread.m:724)
9   libsystem_pthread.dylib         0x00000001b1523d98 _pthread_start + 156 (pthread.c:896)
10  libsystem_pthread.dylib         0x00000001b152774c thread_start + 8

Thread 7:
0   libsystem_pthread.dylib         0x00000001b1527738 start_wqthread + 0

Thread 8:
0   libsystem_pthread.dylib         0x00000001b1527738 start_wqthread + 0

Thread 9:
0   libsystem_pthread.dylib         0x00000001b1527738 start_wqthread + 0

Thread 0 crashed with ARM Thread State (64-bit):
    x0: 0x0000000105d669e0   x1: 0x00000001bef56ef8   x2: 0x0000000000000407   x3: 0x000000000000001e
    x4: 0x0000000105d71c00   x5: 0x0000000000000013   x6: 0x0000000000000000   x7: 0x00000000000003f8
    x8: 0x0000000105d669e8   x9: 0x0000000200000002  x10: 0xfffffffe00000000  x11: 0x0000000000000000
   x12: 0x0000000000000002  x13: 0x0000000000003fff  x14: 0x000000004ca45cf5  x15: 0x000000000000f0be
   x16: 0x00000001b1512ffc  x17: 0x0000000001000002  x18: 0x0000000000000000  x19: 0x0000000105d669e0
   x20: 0x0000000000000000  x21: 0x0000000000000000  x22: 0x0000000000000000  x23: 0x00000001e94156a0
   x24: 0x0000000105d669e0  x25: 0xf000000000000095  x26: 0x000000000000000b  x27: 0x0000000000000002
   x28: 0x00000001042c7c58   fp: 0x000000016bc906a0   lr: 0x00000001becb85e0
    sp: 0x000000016bc90620   pc: 0x00000001becb85e0 cpsr: 0x60000000
   esr: 0xf2000001  Address size fault

我特别关心这一行:

37  Skool                           0x000000010417275c main + 68 (OverdueDashboardSubview.swift:13)

在代码中,该行是:

@FetchRequest(entity: Assignment.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \Assignment.dueDate, ascending: true), NSSortDescriptor(keyPath: \Assignment.name, ascending: true)]) var assignments: FetchedResults<Assignment>

但这对我和我发送测试版的其他所有人来说都很好。崩溃日志中是否缺少某些内容?就像我说的那样,我对编码很陌生,在阅读这样的日志时甚至更新。任何想法将不胜感激!

编辑:这里是 CourseAssignmentListView 的代码:

struct CourseAssignmentsListView: View 
    @FetchRequest(entity: Assignment.entity(),
                  sortDescriptors: [NSSortDescriptor(keyPath: \Assignment.course?.name, ascending: true),
                                    NSSortDescriptor(keyPath: \Assignment.isDue, ascending: false),
                                    NSSortDescriptor(keyPath: \Assignment.dueDate, ascending: true),
                                    NSSortDescriptor(keyPath: \Assignment.name, ascending: true)]) var assignments: FetchedResults<Assignment>

    @EnvironmentObject var accentColor: AccentColorManager
    @Environment(\.managedObjectContext) var context

    @State var course: Course?
    @State private var newAssignment: Assignment? = nil
    @State var newAssignmentViewIsPresented = false

    var body: some View 

        Group 
            if self.assignments.filter( $0.course?.name == self.course?.name ).isEmpty 
                Text("No Assignments")
                    .foregroundColor(.secondary)
                    .font(.largeTitle)
             else 
                List(assignments.filter  $0.course?.name == self.course?.name , id: \.self)  assignment in
                    AssignmentRow(assignment: assignment).environment(\.managedObjectContext, self.context)
                
            
        
        .navigationBarTitle(Text("\(course?.wrappedName ?? "")").foregroundColor(course?.color ?? Color.primary))
        .navigationBarItems(
            trailing: Button(
                action: 
                    self.newAssignment = Assignment(context: self.context)
                    self.newAssignmentViewIsPresented = true
            
            ) 
                Image(systemName: "plus")
                    .accessibility(label: Text("New Assignment"))
                    .font(.title)

        )
            .accentColor(self.accentColor.color)
            .onAppear 
                self.accentColor.color = self.course?.color ?? .green
        
        .sheet(isPresented: $newAssignmentViewIsPresented, content: 
            AssignmentEditorView(assignment: self.newAssignment!, defaultCourse: self.course).environment(\.managedObjectContext, self.context)
        )

    

【问题讨论】:

你需要从这行添加代码 sn-ps 3 Skool 0x0000000104223228 CourseAssignmentsListView.body.getter + 2116 (CourseAssignmentsListView.swift:0) 37是起点,3是在崩溃之前。 @JohnathonKarcz 我为你添加了它! 我在 App Store 上的一个应用程序上遇到了这个确切的崩溃。尽管它在几乎所有相同操作系统和型号的设备上都能正常工作,但数百名 2 名用户在 iPhone 11 上遇到了这种崩溃。这是一场噩梦,但我们无法解决它。 【参考方案1】:

我看到了几乎相同的崩溃。 SwiftUI 似乎仍然存在一个错误,其中 @EnvironmentObject 变量在子视图中无法访问。

您是从 NavigationLink(在 NavigationViewList 中)还是在模式中启动您的 CourseAssignmentsListView床单?如果是这样,请尝试使用 .environmentObject 修饰符直接注入您的 AccentColorManager - 如下所示:

// In the parent view
@EnvironmentObject var accentColor: AccentColorManager

// Wherever you are loading the view from... demonstrating using `NavigationLink`
NavigationLink(CourseAssignmentsListView().environmentObject(self.accentColor))

在我的例子中,我们刚刚让两个发生崩溃的人都报告说这种方法有效。

【讨论】:

不知为何这种方法也适用于我的情况,非常相似,谢谢! 不客气!这是一个很难追踪的,所以我很高兴它帮助了你。

以上是关于SwiftUI 因一位用户的 EXC_BREAKPOINT (SIGTRAP) 而崩溃,我无法在模拟器中复制它的主要内容,如果未能解决你的问题,请参考以下文章

如何让 SwiftUI 动态响应用户事件?

选择消失,仅仅因一千个伤心的理由

“因一条 Linux sudo 命令,我的 Twitter 账号被封了!”

因一段JavaScript无限循环代码,13岁女学生被捕;8亿邮件地址遭泄露;Guava 27.1 正式发布

布洛芬成功史:研发10年因一次宿醉迎来转机,发明人3年前已去世

5面收割字节35k offer,只因一份热乎的Alibaba内部32W字面试手册