2011-03-12 43 views
0

我剛剛升級到Xcode 4並且正在C++項目中工作。我發現printf()間歇性地無法完成打印(中線)到Xcode控制檯,並從那裏printf()停止打印任何東西 - 即使應用程序繼續在調試器中運行。printf()在Xcode 4中的調試過程中間歇性地停止打印

我懷疑Xcode 4的控制檯窗口有問題,因爲如果我將stdout重定向到一個文件,然後記錄似乎繼續沒有任何問題。這就是說,如果我使用命令行以下操作:

尾-f登錄out.txt

然後有時被示出不完整的行倍。但這可能是由於某種緩衝(不完全沖洗),因爲最終文件中的行是完整的。

所以,我想知道是否有人經歷過這樣的事情,並且瞭解Xcode控制檯輸出中導致凍結的原因。

+1

是的,我也經常在Xcode 3中看到類似的東西。我不知道是否有修復。 – 2011-03-12 23:23:32

回答

1

這種行爲似乎是間歇性的,據報道預先存在Xcode 4.作爲解決方法,我對main()函數做了這樣的事情。當Xcode的調試控制檯不正確時,這種方法有一些優點。

#define REDIRECT_STDOUT_TO_FILE 1 

int main(int argc, char ** argv) 
{ 
#if REDIRECT_STDOUT_TO_FILE //## redirect stdout to "log-out.txt" 
    freopen("log-out.txt", "w", stdout); 
#endif // REDIRECT_STDOUT_TO_FILE 

    MyApp app(argc, argv); 

    int result = app.Run(); 

#if REDIRECT_STDOUT_TO_FILE //## redirect stdout to "log-out.txt" 
    fflush(stdout); 
    fclose(stdout); 
#endif // REDIRECT_STDOUT_TO_FILE 

    return result; 
} 

使用尾-f登錄out.txt在終端允許一個以查看標準輸出輸出。或者,如果您使用BBEdit,bbedit - 新窗口註銷.txt也是一個可行的解決方案。

現在,我正在考慮這個Xcode中的錯誤 - 我會繼續嘗試瞭解它在什麼情況下發生。

2

實際上從未在Xcode的工作,但:

你能告訴我們你的printf調用看起來怎麼樣?

我問的原因是,如果你沒有刷新你的流,有些輸出可能無法到達控制檯(正如你在問題中指出的那樣)。最簡單的方法是在每個printf調用結束時添加一個換行符。

+0

printf()行很可能不完全打印,全部以'\ n'結尾。我已經閱讀過其他SO帖子,可能是控制檯中的特殊行爲導致了newline => flush。使用尾部,我看到部分行被打印,並懷疑該流的緩衝區大小是否佔用了這一點 - 而不是換行符的存在。但這只是猜測。 – westsider 2011-03-14 16:24:46

+0

不會導致緩衝區溢出=>堆棧腐敗=>應該拋出一個異常,至少在調試模式下?如果沒有,你可以做如下的事情:看看輸出被截斷的近似長度,然後用更大的字符串對printf運行兩次或多次調用。他們之間手動刷新流(fflush(NULL);我認爲)。如果是緩衝區,則應將所有輸出行都截斷在同一個點上。你有沒有嘗試在另一個編譯器上使用printf的相同參數? – cantrem 2011-03-14 17:55:35

+0

我認爲我所遇到的實際上是Xcode中的一個錯誤。我不那麼輕描淡寫地說。但考慮到通過將stdout重定向到一個文件我不再看到類似凍結的行爲,我必須假定問題本身並不是流式處理或緩衝處理。我使用printf()進行調試,所以輸出結束對我來說無關緊要。在某些方面,流式傳輸到一個文件更好。至於緩衝區溢出,我根本不是在暗示。當緩衝區已滿時,通常會執行流刷新 - 這可能是我在文件流中看到的。 – westsider 2011-03-14 18:31:08