2010-05-27 45 views
1

我想隔離一個令人討厭的bug,這會導致我的Linux內核。我將消息打印到stderr,stderr被重定向到日誌文件。有沒有辦法在文件訪問上禁用緩衝?當內核掛起時,我正在丟失緩衝區中的消息。stderr文件;但沒有緩衝

回答

0

您可以強制刷新緩衝區,使用fflush(stderr);

+0

有許多文件/庫可以強制執行fflush。也不是stderr已經沒有緩衝?我認爲唯一的問題是文件緩衝區。 – 2010-05-27 08:31:48

1

其實,stderr是默認不緩衝的,但我認爲這只是在C運行時的條款。我們與前已經解決了這個:

fflush (stderr); fsync (fileno (stderr)); 

(儘管我們實際上它確實給stdout但同樣的規則也適用 - 實際fflush可能不適合stderr是必要的,但也沒有壞處)。

fflush將C運行時緩衝區刷新到操作系統,fsync強制寫入磁盤。

請記住,這可能會嚴重影響您的表現。

0

你可以嘗試使用setvbuf開始你的應用程序時

setvbuf(stderr, NULL, _IONBF, 0); 

但是,您將獲得閱讀標準輸入輸出緩衝,但依然有「內核」緩衝問題,即不會消失,除非你FSYNC。但是可能跟蹤用戶空間的內核錯誤並不是最好的方式。

您可以使用串行控制檯並在另一臺機器上獲得輸出嗎?這樣你就可以同時獲得oops和stderr消息。