2014-10-08 96 views
4

我們的團隊非常需要一些幫助,以解決我們面臨的以下問題,因爲它會阻止我們調試dispatch_async塊內的一些代碼。Xcode斷點在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

請幫幫忙,一直在瘋狂試圖解決這個問題好幾天。

回答

10

事實證明,這是因爲第三方框架New Relic。刪除對New Relic框架的引用後,我們可以在dispatch_async塊內部進行操作。

因此,對於任何具有新遺物插件的項目的開發人員,您可以暫時刪除對該插件的引用,並在調試ID完成後將其添加回來。

我們花了幾天時間才發現,我們希望這條信息對每個人都有幫助。

+0

關於New Relic發生這種情況的任何想法?你的解決方案工作,我只是想知道爲什麼發生在第一位。 – jamez14 2015-07-21 14:35:53

+0

除了完全刪除NR,您可以禁用dispatch_async的檢測工具,以便即使在dev中仍然可以獲得剩餘的監視。查看我的答案以獲取更多信息。 – dymocaptin 2015-08-11 22:36:15

1

根據配置的構建優化級別該行能夠以這樣的方式,是不可能在它打破(它可以從編譯器輸出甚至刪除,如果您不使用的塊變量)編譯。

嘗試在生成設置中將優化設置爲-O0

+0

我們之前檢查過該標誌,並且優化級別已被設置爲-O0。是否還有其他編譯器設置需要檢查? – garfieldmypet 2014-10-08 12:07:57

+0

我在一個演示項目中測試過;與-O0它停止在bp,以最激進的優化它不停止。我現在不知道其他可能影響斷點的標誌。你清理和建造? – djromero 2014-10-08 12:47:58

+0

我們也在一個全新的項目上進行了測試,並且在dispatch_async中運行了斷點。但是,對於我們現有的項目,即使優化設置爲-O0,也不會中斷。 Yeap,我們再次清理並重新構建,重新安裝Xcode,確保生成調試符號處於打開狀態,但仍然不起作用。還有什麼我們可以做的? – garfieldmypet 2014-10-08 13:17:56

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