Xcode断点不在dispatch_async块内工作

时间:2014-10-08 10:16:29

标签: ios ios8 xcode6 breakpoints dispatch-async

我们的团队非常需要一些帮助来解决我们面临的以下问题,因为它阻止我们调试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 个答案:

答案 0 :(得分:11)

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

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

我们花了几天时间才发现,我们希望这些信息对每个人都有帮助。

答案 1 :(得分: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

答案 2 :(得分:1)

根据配置的构建优化级别,该行可以以不可能破坏的方式进行编译(如果你不这样做,它甚至可以从编译器输出中删除# 39;在块中使用该变量。

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

答案 3 :(得分:0)

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

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