ios - 跟踪 _objc_msgSend 在 dispatch_sync block 内崩溃的策略

标签 ios objective-c-blocks grand-central-dispatch crash-reports hockeyapp

我收到崩溃报告(通过出色的 Hockey )表明我在 dispatch_sync block 内调用的某些代码中遇到了内存问题(或者至少我是这样的) m 解释下面的崩溃报告片段)。我根本无法在我的测试设备上重现此崩溃(因此像 NSZombieEnabled 这样的策略对我没有帮助)。我很乐意更改代码以使崩溃报告提供更多信息(并最终解决根本问题),但我只是不知道从哪里开始。有什么想法吗?

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0xb000000c
Crashed Thread:  7
...
Thread 7 Crashed:
0   libobjc.A.dylib            0x3979bb66 _objc_msgSend + 6
1   libdispatch.dylib          0x39c898fb _dispatch_barrier_sync_f_invoke + 27
2   App                        0x00260f23 __48-[Foo displayLinkCallback]_block_invoke + 147
3   libdispatch.dylib          0x39c85103 _dispatch_call_block_and_release + 11
4   libdispatch.dylib          0x39c894bf _dispatch_async_redirect_invoke + 111
5   libdispatch.dylib          0x39c8a7e5 _dispatch_root_queue_drain + 225
6   libdispatch.dylib          0x39c8a9d1 _dispatch_worker_thread2 + 57
7   libsystem_pthread.dylib    0x39db4dff __pthread_wqthread + 299

dispatch_sync 提供了一个静态串行队列。 _objc_msgSend 是否可能指示引用此队列的问题而不是 block 内的某些问题?

为了先发制人,我在这些崩溃报告中没有看到任何死锁迹象。

更新(13 年 10 月 8 日)

按要求添加代码(方法和变量名称已更改,但仍接近原始名称)。我怀疑问题出在复制 foo 的某个地方。我希望这个问题会产生调试这个错误的策略。如果“逐行检查”是调试 _objc_msgSenddispatch_sync block 内崩溃的最佳策略,那么它有点难过,但我会在这方面寻求任何帮助点。

另外,我应该指出,我正在调查的崩溃只发生在单核设备上,而且是间歇性的。

- (void) displayLinkCallback
{
    dispatch_async(_frameDispatchQueue, ^{
        if ([_lock tryLock])
        {
            dispatch_sync(_renderQueueSerial, ^{
                NSObject *fooCopy = nil;
                BOOL bar = NO;

                // prevents deallocation during subsequent copy
                // _foo is set and/or its child objects changed 
                // many times per second by other threads)
                NSObject *foo = _foo;

                // copy foo 
                fooCopy = [foo copy];

                bar = [self needsBarGivenFoo:fooCopy];
                if (bar)
                {
                    _lastFoo = foo;
                    [self goFoo:fooCopy];
                }
                else
                {
                    [self noFoo:fooCopy];
                }
            });
            [_lock unlock];
        }
    });
}

最佳答案

我建议您开始分析源文件中的那些引用。这个符号化的崩溃日志表明您的崩溃源于 Foo 类中的 displayLinkCallback 方法。您可能应该从那里开始调查。

它告诉您存在分段违规。但如果不查看该方法的源代码,就很难进一步诊断。

关于ios - 跟踪 _objc_msgSend 在 dispatch_sync block 内崩溃的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18797250/

相关文章:

objective-c - 通过弱指针分配给 Block 中的 ivar

ios - 为什么 NSTimer 触发的 Action 不能由 block 指定?

ios - swift 3 : DispatchQueue Timing over URLSession

ios - 嵌套回调强引用循环

ios - 如何将图像从 Parse 加载到 UIImageView (iOS)

ios - 剪辑/控制表格 View 的滚动

objective-c - 回调 block 中的 NSJSONSerialization 泄漏

iOS线程: does this ensure the completion to be called from the main thread?

ios - FFT iOS 值加倍?

ios - 如何将(可选的)完成处理程序关闭传递给 Swift 中的 transitionFromViewController?