2015-10-26 28 views
2

捕捉我習慣叫我的程序與此線在bash shell中捕獲所有輸出和錯誤消息在日誌文件中核心轉儲信息沒有在STDERR

./a.out input.txt 2>&1 | tee log 

日誌文件顯示錯誤,但通過檢查日誌顯然存在問題,程序在執行過程中突然終止。

我也嘗試了這些,但結果是一樣的:

./a.out input.txt > log 2>&1 

./a.out input.txt |& tee log 

當我運行沒有任何這樣的重定向:

./a.out input.txt 

我看到在我的終端窗口中的錯誤信息結束於:

*** Error in `./a.out': free(): invalid pointer: 0x000000000169b268 *** 
Aborted (core dumped) 

那麼,爲什麼我不能捕獲我的日誌中的「核心轉儲」消息?我該怎麼做才能做到這一點?

+0

某些程序只能打印某些消息到標準交互式shell)。當stderr連接到管道時,這些消息可能會被抑制。 – 4ae1e1

+0

我的猜測是你的shell在重定向輸出崩潰的程序之後打印出「Error in x:free()」等消息。你可以嘗試在一個子shell中運行這個進程:'$(./a.out)> log> 2>&1' - 我會嘗試,但是沒有Linux的方便。 –

+0

我寫了這個程序,我沒有做任何特別的事情,不管它是否連接到tty。這是我寫的一個簡單程序,用於動態數組的遞歸合併排序並刪除它們。我在Ubuntu下用g ++編譯。 – Convergent

回答

5

有2個錯誤消息這裏:

*** Error in `./a.out': free(): invalid pointer: 0x000000000169b268 *** 

這來自glibc的,並且被打印在當前的tty,如果它的存在。

如果您希望將其打印到stderr(無論stderr重定向到哪裏),則必須在啓動程序之前設置 LIBC_FATAL_STDERR_。 例如在bash做:

export LIBC_FATAL_STDERR_=1 

其他消息

Aborted (core dumped) 

這個從開始你的程序的外殼,由外殼檢查)的wait狀態(。 如果該程序不是由shell運行的,或者例如由已經終止的shell運行,您將無法捕獲該消息。即使shell沒有終止,該shell的stderr也不會重定向到您的日誌文件。

你可能會得到周圍做:當它連接到一個TTY(文字終端,你可以解釋爲

{ ./a.out input.txt ; } >log 2>&1 

參見redirection of ./a.out is not capturing segmentation fault

+0

關於LIBC_FATAL_STDERR_的第一個建議是正確的。我現在在日誌中看到「*** Error ...」。但是,第二項建議不起作用。即使帶括號,「中止」消息仍然在終端窗口中,而不是在日誌中。 – Convergent

+0

是的,顯然你需要護腕,而不是括號(產生一個子殼)。雖然目前還不清楚爲什麼子外殼不起作用。 – nos