2016-10-16 25 views
0

我做了一個C程序,會拋出分段錯誤錯誤,每當我運行它。然後我做了一個bash腳本如下:如何在bash中檢查程序的運行時錯誤?

cat input.txt | ./a.out 1> output.txt 2> error.txt 
cat error.txt 

第二行的輸出應該是類似分段錯誤(核心轉儲) 但是,相反它是一個空白文件。

如何捕獲C程序的運行時錯誤?

+0

管道和stderr重定向操作符的運算符優先級是什麼? – Dai

+0

@戴,對不起,我沒有得到你的問題。你能簡化它嗎? – dannyBoy

+0

避免不必要地使用'cat'(例如'./a.out output.txt 2> error.txt' –

回答

2

您的問題,從一個事實,即Segmentation fault (core dumped)消息你的程序產生莖,它是由外殼中,你可以在a.out命令生成。該過程看起來大約是這樣的:

  • 你的程序生成一個段錯誤
  • 你的程序接收到SIGSEGV信號
  • 程序退出
  • 你的shell退出時的狀態碼執行的wait()系統調用表示您的程序由於SIGSEGV信號而異常退出。
  • 殼輸出錯誤消息

這在一定程度上更詳細地討論this answer

如果你想捕獲該輸出,你可以嘗試這樣的:

$ sh -c 'trap "" 11; ./a.out' 1> output.txt 2> error.txt 
$ cat error.txt 
Segmentation fault (core dumped) 

這將在一個子進程運行代碼,並將由殼抑制段錯誤的默認處理。

+0

*「」11; *在trap中做什麼? – dannyBoy

+0

'man bash'有答案: 「如果arg是空字符串,則每個sigspec指定的信號都會被shell和其調用的命令忽略。」 – larsks

相關問題