Из 6 тестеров один пользователь столкнулся с ошибкой sh в строке, в которой указано только:
someDispatchQueue.sync { //Thread 0 crash
someDispatchQueue
не может быть нулевым, потому что оно объявлено как
let someDispatchQueue = DispatchQueue(label: "SomeDispatchQueue")
в начале класса.
Единственные две причины sh там, которые я мог придумать, это
A) проблемы с тем, как это при вызове, а именно как
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + delay) {
//a few functions in between
someDispatchQueue.sync {
Может быть, вы не можете позвонить на customQueue.sync{}
внутри main.async{}
? Тем не менее, этот тестировщик - единственный, кто испытал эту ошибку sh, тогда как он на 99% уверен, что другие 5 тестеров тоже запускают эту функцию - без каких-либо проблем. Он также работает на моем устройстве без проблем.
B) указанная строка журнала отключена
Должны ли журналы Swift cra sh отображать точную точку сбоя? Или это может быть несколько строк? В журнале написано следующее:
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000001, 0x0000000100f2f95c
Termination Signal: Trace/BPT trap: 5
Termination Reason: Namespace SIGNAL, Code 0x5
Terminating Process: exc handler [6599]
Triggered by Thread: 0
Thread 0 name:
Thread 0 Crashed:
0 AppName 0x0000000100f2f95c closure #1 in FileDB.prepareFile() + 508 (<compiler-generated>:0)
1 AppName 0x0000000100f39734 partial apply for thunk for @callee_guaranteed () -> () + 20 (<compiler-generated>:0)
2 AppName 0x0000000100f2ccf4 thunk for @escaping @callee_guaranteed () -> () + 20 (<compiler-generated>:0)
3 libdispatch.dylib 0x000000019770c33c _dispatch_client_callout + 20 (object.m:495)
4 libdispatch.dylib 0x00000001977191f4 _dispatch_lane_barrier_sync_invoke_and_complete + 60 (queue.c:996)
5 AppName 0x0000000100f2f6b4 FileDB.prepareFile() + 264 (FileDB.swift:138) //line 138 is the someDispatchQueue.sync {
6 AppName 0x0000000100f79844 ICEFrameworkHandler.initiateWrite() + 728 (ICEFrameworkHandler.swift:254)
7 AppName 0x0000000100f78e18 closure #1 in ICEFrameworkHandler.delayRun(delay:stamp:) + 140 (ICEFrameworkHandler.swift:164) //the function that calls the DispatchQueue.main.asyncAfter
8 AppName 0x0000000100f7e508 thunk for @escaping @callee_guaranteed () -> () + 28 (<compiler-generated>:0)
9 libdispatch.dylib 0x000000019770c33c _dispatch_client_callout + 20 (object.m:495)
10 libdispatch.dylib 0x000000019770eaf8 _dispatch_continuation_pop + 408 (inline_internal.h:2484)
11 libdispatch.dylib 0x000000019771f624 _dispatch_source_invoke + 1224 (source.c:568)
12 libdispatch.dylib 0x00000001977184f0 _dispatch_main_queue_callback_4CF + 560 (inline_internal.h:2525)
13 CoreFoundation 0x00000001979e76b0 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 16 (CFRunLoop.c:1749)
14 CoreFoundation 0x00000001979e22c8 __CFRunLoopRun + 1708 (CFRunLoop.c:3069)
15 CoreFoundation 0x00000001979e18f4 CFRunLoopRunSpecific + 480 (CFRunLoop.c:3192)
16 GraphicsServices 0x00000001a1df8604 GSEventRunModal + 164 (GSEvent.c:2246)
17 UIKitCore 0x000000019bbb5358 UIApplicationMain + 1944 (UIApplication.m:4823)
18 AppName 0x0000000100f150b4 main + 68 (AppDelegate.swift:19)
19 libdyld.dylib 0x000000019785d2dc start + 4
@ matt
let someDispatchQueue = DispatchQueue(label: "SomeDispatchQueue")
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 0.1) {
someDispatchQueue.sync {
print("someDispatchQueue.sync") //prints first, no exception
}
print("end of asyncAfter()") //prints second, reaches statement without exception
}