いくつかのプログラムをテストするためのbashスクリプトがあり、プログラムの1つが返されるので、Segmentation fault
スクリプトヘッドにトラップを追加してみました。
trap "echo 'segfault occured!'" SIGSEGV
しかし、これは何の効果もありませんでした。使った
echo $?
segfaultを生成するプログラムの直後に139出力として。この特定のエラーコードのトラップをどのように追加できますか?
答え1
trap "$instructions" SIGSEGV
シェル自体から分割エラーをキャッチします。
でスクリプトを実行すると(または)トラップを配置できますset -e
。スクリプトが終了したときに実行されます(ゼロ以外の状態を返すコマンドのため、明示的な呼び出しまたはスクリプトの終わりから外れた場合)。分割エラーをテストするには、トラップのエントリポイントを確認してください。 (プログラムは正常に状態139に返されるため、おそらく139です。シェルで実行している場合はこれを回避できます。)EXIT
0
exit
$?
$?
set -e
trap 'case $? in
139) echo "segfault occurred";;
esac' EXIT
set -e
Bash、ksh、またはzshでは、ゼロ以外の状態を返すすべてのコマンドの後にトラップを実行する必要はなく、代わりにトラップを配置できますERR
。以前と同様に、$?
トラップのエントリポイントを確認する必要があります。 139は、(まれに)プログラムがこの状態を返したことを意味します。
答え2
からman bash
:
trap [-lp] [[arg] sigspec ...]
The command arg is to be read and executed when the shell
receives signal(s) sigspec.
プログラムsegfaultが発生すると、SIGCHLD
一部の子が(何らかの方法で)終了したため、bashはエラーを受け取ります。
$?
ただし、特定の条件とトラップに保存されている終了コードを使用できますSIGCHLD
。
trap 'if [[ $? -eq 139 ]]; then echo "segfault !"; fi' CHLD
set -bm
非対話型bash(スクリプトなど)でこの機能(何ができるか)を使用している場合は、これを行う必要があります。
編集する:また、見ることができますこの(ザイルズの)答え同様の質問にはとbash
を使用してくださいtrap
。