6

我们的团队非常需要一些帮助来解决我们面临的以下问题,因为它阻止我们调试 dispatch_async 块中的一些代码。

希望我能得到一些关于下一步做什么的帮助或建议。

我们面临的问题如下:

我们最近遇到了一个奇怪的问题,在 Xcode 6 中,我们无法在 dispatch_async 块内中断。

- (void)viewDidLoad {

        dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);    

        dispatch_async(queue, ^{


        BOOL setRtn = TRUE;  //<- break point is set here but never break

        //call to function
        BOOL setFn = some_function();
        });

} 



- (BOOL) some_function()
{
     BOOL test = YES;   <- break point set here, breakpoint break!


     return test;
}

发生的情况是,当我们在 dispatch_async 块的任何行中设置断点时,代码永远不会中断,并且断点永远不会起作用。

但是,如果我们在 dispatch_async 块调用的函数中设置断点,断点就会起作用!

还有其他人面临同样的问题吗?

我们正在使用 Xcode 6.1 并且正在开发 IOS8.1

请帮忙,几天来一直在疯狂地试图解决这个问题。

4

4 回答 4

11

事实证明,这是因为第 3 方框架 New Relic。删除对 New Relic 框架的引用后,我们可以进入 dispatch_async 块。

因此,对于任何从事具有新 relic 插件的项目的开发人员,您可以暂时删除对该插件的引用,并在您的调试 id 完成后将其添加回来。

我们花了几天时间才知道,希望这条信息对大家有所帮助。

于 2014-10-09T05:46:08.543 回答
11

事实证明,Grand Central Dispatch 检测确实可以防止 dispatch_async 块中的断点。您可以通过将以下内容添加到您的 prefix.pch 文件来禁用您的环境中的 GCD 宏:

#ifdef DEBUG
#undef dispatch_async 
#undef dispatch_sync 
#undef dispatch_after 
#undef dispatch_apply 
#undef _dispatch_once 
#endif
于 2015-08-06T19:51:30.467 回答
1

根据配置的构建优化级别,该行可以以不可能中断的方式编译(如果您不在块中使用该变量,它甚至可以从编译器输出中删除)。

尝试-O0在构建设置中设置优化。

于 2014-10-08T10:43:20.360 回答
0

我知道这没有多大意义,但对我来说,Clean build 文件夹舞蹈与包裹在 aDispatchQueue.main.async中的一些 Swift 4.2 代码一起工作,并没有在断点处停止;在清理和重建之后,它现在按预期中断。

我正在使用 Xcode 10.1,我的优化级别构建设置已经是None -O0,正如此处其他答案中所建议的那样。

于 2019-01-24T05:07:57.417 回答