我正在尝试调试我的应用程序的一些用户发生的崩溃,不经常以不可重现的方式发生。
堆栈如下所示:
Thread 0 Crashed:
0 libobjc.A.dylib objc_msgSend
1 libdispatch.dylib _dispatch_client_callout
2 libdispatch.dylib _dispatch_barrier_sync_f_invoke
3 com.myapp.CorePlayer -[PreoutWorker cancel] + 89
[PreoutWorker cancel]
方法如下所示:
- (void)cancel {
dispatch_sync(_workerQueue, ^{
if ([self isExecutingI]) {
++self -> _act;
[self -> _device stop];
[self resetI];
}
});
}
该应用程序大量使用线程,但所有其他线程都是空闲或无关的事情。
PreoutWorker
对象向其客户端提供thread safe interface
(它们总是在主线程上调用它。)在内部,它将工作分派给_workerQueue
,这是一个串行调度队列。
在我看来,cancel
方法产生此崩溃的唯一方法是objc_msgSend
是传递给dispatch_sync
的块中的一个调用。
dispatch_sync
的标题文档表明这可能是可行的,但对于细节却令人沮丧地模糊:
*作为优化,dispatch_sync()调用块上的 当前
*尽可能的线程。
有没有人知道“在可能的情况下”究竟是什么意思?