Как интерпретировать отчет о сбое iOS EXC_BREAKPOINT? - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть приложение для iOS, которое вылетает с некоторыми пользователями.Я не могу воссоздать сбой, но у меня есть три идентичных отчета о сбое.Как я могу выяснить, что является причиной сбоя?(Я посмотрел на https://developer.apple.com/videos/play/wwdc2018/414/, но все еще испытываю трудности.)

Выдержка из отчета о сбое выглядит следующим образом:

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

Thread 0 name:
Thread 0 Crashed:
0   libswiftCore.dylib              0x0000000100fd21ac 0x100de0000 + 2040236
1   libswiftCore.dylib              0x0000000100fd21ac 0x100de0000 + 2040236
2   libswiftCore.dylib              0x0000000101027c50 0x100de0000 + 2391120
3   MyApp                           0x000000010081af08 partial apply for closure #3 in DefaultService.processPosts(network:posts:completion:) + 40 (DefaultService.swift:1009)
4   MyApp                           0x000000010087060c thunk for @escaping @callee_guaranteed () -> () + 36 (<compiler-generated>:0)
5   libdispatch.dylib               0x000000021aeb96c8 _dispatch_call_block_and_release + 24 (init.c:1372)
6   libdispatch.dylib               0x000000021aeba484 _dispatch_client_callout + 16 (object.m:511)

Код, который, кажется, вызываетпроблема DefaultService.swift:1009 в processPosts заключается в следующем:

private func processPosts(network: Network, posts: [Post], completion: @escaping (Result<Void>) -> Void) {
   ...
   dg.notify(queue: .main) {
        self.savePosts(network: network, posts: posts) // This is line 1009.
        completion(.success(()))
    }
}

private func savePosts(network: Network, posts: [Post]) {
    let context = self.container().viewContext

    for post in posts {
        // Don't save if already saved.
        if isPostSaved(context: context, network: network,
                            networkPostID: post.networkPostID!) {
            continue
        }

        let np = NetworkPost(context: context)
        np.id = post.id
        np.network = network.rawValue
        np.networkPostID = post.networkPostID
        np.subtitle = post.subtitle
        np.text = post.text

        for image in post.images {
            let npImage = NetworkPostImage(context: context)
            npImage.data = image
            np.addToImages(npImage)
        }
        if let active = post.active {
            np.active = active
        }
        np.created = post.created
    }

    try! context.save()
}

private func isPostSaved(context: NSManagedObjectContext, network: Network, networkPostID: String) -> Bool {
    let fetchRequest = NSFetchRequest<NetworkPost>(entityName: "NetworkPost")
    let format = "(network == %@) AND (networkPostID == %@)"
    fetchRequest.predicate = NSPredicate(format: format,
                                         network.rawValue,
                                         networkPostID)

    let posts = try! context.fetch(fetchRequest)
    return !posts.isEmpty
}

Вполне вероятно, что один из моих try! вызовов в savePosts или isPostSaved является виновником, вызывающим EXC_BREAKPOINT?

Если так, как я могу определить, какой это?Есть ли способ использовать первые три libswiftCore.dylib вызова backtrace, чтобы выяснить это?

Если не вызовы try!, то что еще может вызывать ошибку EXEC_BREAKPOINT?

Обратите внимание, что я использую API-интерфейс CoreData в режиме «только память», поэтому я ожидаю, что мои вызовы try! context.save() и try! context.fetch(fetchRequest) будут выполняться, если что-то не так серьезно или у меня возникла программная ошибка.Вот почему я использую try! вместо do { } catch { }.

...