ios - 如何解释 iOS EXC_BREAKPOINT 崩溃报告?
问题描述
我有一个与某些用户崩溃的 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
回溯的前三个调用来解决这个问题?
如果不是try!
电话,那么还有什么可能导致EXEC_BREAKPOINT
错误?
请注意,我在仅内存模式下使用 CoreData API,因此我希望我的try! context.save()
和try! context.fetch(fetchRequest)
调用能够执行,除非出现严重错误或编程错误。这就是为什么我使用try!
而不是do { } catch { }
.
解决方案
推荐阅读
- python - 编写多次尝试的更优雅的方式,除了
- c++ - 使用指针(new int[size])时,是否需要在代码前确定size?
- python - 创建 Tkinter GUI 并将其连接到 RiveScript 聊天机器人:将控制台输出放入我的 UI
- java - 如何使用 Binary Search 打印两个不同 ArrayLists 中匹配索引的所有字符串?
- javascript - React 中的 Virtual DOM 如何帮助在 UI 中渲染真实的 DOM?
- arrays - 删除动态数组中等于零的元素而不使用C语言中的辅助数组
- r - 协调多对滑块和数字输入 r 闪亮
- java - 如何检索 s:set for Struts2 的动态生成的名称标签?
- python - 在python中一次填充一个数组时出现奇怪的结果
- vba - 使文本框在条件下可见