Search code examples
swiftxcodecore-dataswiftuixcode-previews

Xcode SwiftUI Preview Crashes, Simulator and Device Works Fine


At some point during the development of my SwiftUI app the canvas preview stopped loading. The app uses CoreData, and the crash log suggests issues with the persistence function. The app continues to work as expected on the device and using the simulator.

Top part of the crash log from preview:

Path:                  /Users/USER/Library/Developer/Xcode/UserData/Previews/Simulator Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Bundle/Application/0011D911-75A5-4D79-AFA2-34BA2CB9E805/Training.app/Training
Identifier:            Training
Version:               1.5 (11)
Code Type:             X86-64 (Native)
Parent Process:        launchd_sim [80779]
Responsible:           SimulatorTrampoline [984]
User ID:               501

Date/Time:             2021-08-17 16:55:41.451 +0100
OS Version:            macOS 11.5 (20G71)
Report Version:        12
Bridge OS Version:     3.0 (14Y908)
Anonymous UUID:        A9FE029F-99BA-7511-2780-E515C2BA21E9

Sleep/Wake UUID:       EA1649DE-D2A1-438F-8B86-9C8D63032F7F

Time Awake Since Boot: 160000 seconds
Time Since Wake:       11000 seconds

System Integrity Protection: enabled

Crashed Thread:        0  Dispatch queue: com.apple.main-thread

Exception Type:        EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes:       0x0000000000000001, 0x0000000000000000
Exception Note:        EXC_CORPSE_NOTIFY

Termination Signal:    Illegal instruction: 4
Termination Reason:    Namespace SIGNAL, Code 0x4
Terminating Process:   exc handler [81046]

Application Specific Information:
Training/Persistence.swift:17: Fatal error: Unresolved error Error Domain=NSCocoaErrorDomain Code=134110 "An error occurred during persistent store migration." UserInfo={sourceURL=file:///Users/liamday/Library/Developer/Xcode/UserData/Previews/Simulator%20Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Data/Application/723C3942-DBEE-4A0E-BBBE-5F3B7F5F01A1/Library/Application%20Support/Training.sqlite, reason=Cannot migrate store in-place: I/O error for database at /Users/liamday/Library/Developer/Xcode/UserData/Previews/Simulator Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Data/Application/723C3942-DBEE-4A0E-BBBE-5F3B7F5F01A1/Library/Application Support/Training.sqlite.  SQLite error code:1, 'no such table: ZPROGRAMS', destinationURL=file:///Users/liamday/Library/Developer/Xcode/UserData/Previews/Simulator%20Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Data/Application/723C3942-DBEE-4A0E-BBBE-5F3B7F5F01A1/Library/Application%20Support/Training.sqlite, NSUnderlyingError=0x6000016b1200 {Error Domain=NSCocoaErrorDomain Code=134110 "An error occurred during persistent store migration." UserInfo={NSSQLiteErrorDomain=1, NSFilePath=/Users/liamday/Library/Developer/Xcode/UserData/Previews/Simulator Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Data/Application/723C3942-DBEE-4A0E-BBBE-5F3B7F5F01A1/Library/Application Support/Training.sqlite, NSUnderlyingException=I/O error for database at /Users/liamday/Library/Developer/Xcode/UserData/Previews/Simulator Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Data/Application/723C3942-DBEE-4A0E-BBBE-5F3B7F5F01A1/Library/Application Support/Training.sqlite.  SQLite error code:1, 'no such table: ZPROGRAMS', reason=I/O error for database at /Users/liamday/Library/Developer/Xcode/UserData/Previews/Simulator Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Data/Application/723C3942-DBEE-4A0E-BBBE-5F3B7F5F01A1/Library/Application Support/Training.sqlite.  SQLite error code:1, 'no such table: ZPROGRAMS'}}}, ["reason": Cannot migrate store in-place: I/O error for database at /Users/liamday/Library/Developer/Xcode/UserData/Previews/Simulator Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Data/Application/723C3942-DBEE-4A0E-BBBE-5F3B7F5F01A1/Library/Application Support/Training.sqlite.  SQLite error code:1, 'no such table: ZPROGRAMS', "NSUnderlyingError": Error Domain=NSCocoaErrorDomain Code=134110 "An error occurred during persistent store migration." UserInfo={NSSQLiteErrorDomain=1, NSFilePath=/Users/liamday/Library/Developer/Xcode/UserData/Previews/Simulator Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Data/Application/723C3942-DBEE-4A0E-BBBE-5F3B7F5F01A1/Library/Application Support/Training.sqlite, NSUnderlyingException=I/O error for database at /Users/liamday/Library/Developer/Xcode/UserData/Previews/Simulator Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Data/Application/723C3942-DBEE-4A0E-BBBE-5F3B7F5F01A1/Library/Application Support/Training.sqlite.  SQLite error code:1, 'no such table: ZPROGRAMS', reason=I/O error for database at /Users/liamday/Library/Developer/Xcode/UserData/Previews/Simulator Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Data/Application/723C3942-DBEE-4A0E-BBBE-5F3B7F5F01A1/Library/Application Support/Training.sqlite.  SQLite error code:1, 'no such table: ZPROGRAMS'}, "sourceURL": file:///Users/liamday/Library/Developer/Xcode/UserData/Previews/Simulator%20Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Data/Application/723C3942-DBEE-4A0E-BBBE-5F3B7F5F01A1/Library/Application%20Support/Training.sqlite, "destinationURL": file:///Users/liamday/Library/Developer/Xcode/UserData/Previews/Simulator%20Devices/836D94C3-1BF9-40BD-88EA-85DDF55F71E0/data/Containers/Data/Application/723C3942-DBEE-4A0E-BBBE-5F3B7F5F01A1/Library/Application%20Support/Training.sqlite]
 
CoreSimulator 757.5 - Device: iPhone 12 Pro (836D94C3-1BF9-40BD-88EA-85DDF55F71E0) - Runtime: iOS 14.5 (18E182) - DeviceType: iPhone 12 Pro

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libswiftCore.dylib              0x00007fff2f07cd1e _assertionFailure(_:_:file:line:flags:) + 1742
1   co.uk.LiamDay.Training          0x0000000105d3266a closure #1 in PersistenceController.init(inMemory:) + 890 (Persistence.swift:17)
2   co.uk.LiamDay.Training          0x0000000105d326fb thunk for @escaping @callee_guaranteed (@guaranteed NSPersistentStoreDescription, @guaranteed Error?) -> () + 139
3   CoreData                        0x00007fff251a7838 -[NSPersistentStoreCoordinator _doAddPersistentStoreWithDescription:privateCopy:completeOnMainThread:withHandler:] + 978
4   CoreData                        0x00007fff251a7c3a -[NSPersistentStoreCoordinator addPersistentStoreWithDescription:completionHandler:] + 236
5   CoreData                        0x00007fff2514b01b -[NSPersistentContainer _loadStoreDescriptions:withCompletionHandler:] + 272
6   CoreData                        0x00007fff2514aee4 -[NSPersistentContainer loadPersistentStoresWithCompletionHandler:] + 398
7   co.uk.LiamDay.Training          0x0000000105d32144 PersistenceController.init(inMemory:) + 1060 (Persistence.swift:15)
8   co.uk.LiamDay.Training          0x0000000105d31d01 one-time initialization function for shared + 17 (Persistence.swift:6)
9   libdispatch.dylib               0x00007fff201078df _dispatch_client_callout + 8
10  libdispatch.dylib               0x00007fff20108b16 _dispatch_once_callout + 20
11  libswiftCore.dylib              0x00007fff2f3a059a swift_once + 26
12  co.uk.LiamDay.Training          0x0000000105d32234 PersistenceController.shared.unsafeMutableAddressor + 52 (Persistence.swift:6)
13  co.uk.LiamDay.Training          0x0000000105e73ba0 TrainingApp.init() + 80 (TrainingApp.swift:12)
14  co.uk.LiamDay.Training          0x0000000105e73ce1 protocol witness for App.init() in conformance TrainingApp + 17
15  com.apple.SwiftUI               0x00007fff562e5376 static App.main() + 47
16  co.uk.LiamDay.Training          0x0000000105e73c6e static TrainingApp.$main() + 78 (TrainingApp.swift:10)
17  co.uk.LiamDay.Training          0x0000000105e73d04 main + 20
18  libdyld.dylib                   0x00007fff2025abbd start + 1

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

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

Thread 0 crashed with X86 Thread State (64-bit):
  rax: 0x0000000200000003  rbx: 0x0000000106005a90  rcx: 0xfffffffe00000000  rdx: 0x0000000000000003
  rdi: 0x00007fe683033208  rsi: 0x0000000000000103  rbp: 0x00007ffee9ed0430  rsp: 0x00007ffee9ed0390
   r8: 0x0000000106868a00   r9: 0x00000001068603e0  r10: 0x0000000000000040  r11: 0x000000000000003b
  r12: 0x0000000000000f30  r13: 0x00007ffee9ed0350  r14: 0x000000000000000b  r15: 0x00007ffee9ed0390
  rip: 0x00007fff2f07cd1e  rfl: 0x0000000000010246  cr2: 0x00007fff2067e4ee
  
Logical CPU:     1
Error Code:      0x00000000
Trap Number:     6

Thread 0 instruction stream:
  fe fe fe fe fe fe 00 b9-20 00 00 00 45 85 c0 74  ........ ...E..t
  07 41 0f bd c8 83 f1 1f-c1 e9 03 be 04 00 00 00  .A..............
  48 29 ce 8d 0c f5 00 00-00 00 48 c7 c2 ff ff ff  H)........H.....
  ff 48 d3 e2 48 f7 d2 44-89 c1 48 01 c1 48 21 d1  .H..H..D..H..H!.
  48 89 4d b8 48 8d 15 77-15 00 00 48 8d 7d b8 e8  H.M.H..w...H.}..
  1e 35 2d 00 4c 89 fc 48-8b 7d d0 e8 12 df 32 00  .5-.L..H.}....2.
 [0f]0b 55 48 89 e5 31 c0-5d c3 0f 1f 84 00 00 00  ..UH..1.]....... <==
  00 00 55 48 89 e5 41 57-41 56 41 55 41 54 53 50  ..UH..AWAVAUATSP
  4d 89 cc 45 89 c6 49 89-cf 48 89 d3 49 89 f5 ff  M..E..I..H..I...
  d7 49 89 d0 48 8d 3d bb-14 38 00 be 0b 00 00 00  .I..H.=..8......
  ba 02 00 00 00 48 89 c1-49 89 d9 6a 00 41 54 41  .....H..I..j.ATA
  56 41 57 e8 da f8 ff ff-48 83 c4 20 0f 0b 0f 1f  VAW.....H.. ....
  
Thread 0 last branch register state not available.

This is my Persistence.swift file:

import CloudKit

struct PersistenceController {
    //MARK: - 1. PERSISTENCE CONTROLLER
    static let shared = PersistenceController()
    //MARK: - 2. PERSISTENT CONTAINER
    let container: NSPersistentContainer
    //MARK: - 3. INIT (load the persistent store)
    init(inMemory: Bool = false) {
        container = NSPersistentContainer(name: "Training")
        if inMemory {
            container.persistentStoreDescriptions.first!.url = URL(fileURLWithPath: "/dev/null")
        }
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
    }
    //MARK: - 4. PREVIEW
    static var preview: PersistenceController = {
        let result = PersistenceController(inMemory: true)
        let viewContext = result.container.viewContext
        
        let plannedExercise1 =  PlannedWorkouts(context: viewContext)
        plannedExercise1.dateCreated = Date()
        plannedExercise1.dateOfWorkout = Date()
        plannedExercise1.duration = 3600.00
        plannedExercise1.totalDistanceUnit = "meters"
        plannedExercise1.totalDistanceDoubleValue = 5000.0
        plannedExercise1.totalEnergyBurnedUnit = "KCal"
        plannedExercise1.totalEnergyBurnedDoubleValue = 500.0
        plannedExercise1.workoutActivityType = 32
        plannedExercise1.id = UUID()
        
        let plannedExercise2 =  PlannedWorkouts(context: viewContext)
        plannedExercise2.dateCreated = K.init().EndOfWeek(weeksSinceAnchorDate: 1)
        plannedExercise2.dateOfWorkout = Date()
        plannedExercise2.duration = 3600.00
        plannedExercise2.totalDistanceUnit = "meters"
        plannedExercise2.totalDistanceDoubleValue = 5000.0
        plannedExercise2.totalEnergyBurnedUnit = "KCal"
        plannedExercise2.totalEnergyBurnedDoubleValue = 500.0
        plannedExercise2.workoutActivityType = 35
        plannedExercise2.id = UUID()
        
        let newStatisticChartView = ChartView(context: viewContext)
        newStatisticChartView.id = UUID()
        newStatisticChartView.chartViewRawValue = "dailyTrainingImpactChartView"
        
        let newGoalView = GoalViews(context: viewContext)
        newGoalView.startDate = K.init().EndOfWeek(weeksSinceAnchorDate: 1)
        newGoalView.endDate = K.init().EndOfWeek(weeksSinceAnchorDate: 2)
        newGoalView.id = UUID()
        newGoalView.totalDistanceUnit = "meters"
        newGoalView.totalDistanceDoubleValue = 30000
        newGoalView.workoutActivityType = Int16(32)
        
        let newProgram = Programs(context: viewContext)
        
        let newProgrammedWorkout = ProgrammedWorkouts(context: viewContext)
        
        let newPlannedProgram = PlannedPrograms(context: viewContext)
        
        
        do {
            try viewContext.save()
        } catch {
            let nsError = error as NSError
            fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
        }
        return result
    }()
}

I have restarted Xcode and cleared the derived data. What should I try next? Or is this the limitations of the previewer with SwiftUI for complex app builds?


Solution

  • The answer to your question is in the long string of the debug output. Simply put, there is a problem with updating the database Training.sqlite which is created automatically by the persistent container framework.

    Try deleting these folders / files manually. You can find the full path in the error message.

    Also, as pointed out by other posters, it is advisable to use PersistentController.preview when constructing the preview database. It will then always be created from scratch in memory.