139(セグメンテーション違反)を返すプログラムをbashでトラップするにはどうすればよいですか?


10

一部のプログラムをテストするbashスクリプトがあり、そのプログラムの1つが返されるSegmentation faultため、スクリプトの先頭にトラップを追加しようとしました。

trap "echo 'segfault occured!'" SIGSEGV

しかし、それは何もしませんでした。使った

echo $?

segfaultを生成するプログラムの直後に、出力として139が表示されます。特定のエラーコードのトラップを追加するにはどうすればよいですか?

回答:


7

trap "$instructions" SIGSEGV シェル自体のセグメンテーション違反をトラップします。

でスクリプトを実行する場合set -e、トラップEXIT(または0)を設定できます。これは、スクリプトが終了したときに実行されます(コマンドがゼロ以外のステータスを返したためか、明示的に呼び出すexitか、スクリプトの最後から落ちた場合)。セグメンテーション違反をテスト$?するには、トラップへのエントリを確認します。($?プログラムがステータス139で正常に戻ったため、139になる可能性があることに注意してください。これは、シェルで処理を行う場合は回避できます。)

set -e
trap 'case $? in
        139) echo "segfault occurred";;
      esac' EXIT

bashまたはkshまたはzshではset -e、ゼロ以外のステータスを返す各コマンドの後にトラップを実行するためにを使用する必要はありませんERR。代わりにトラップを置くことができます。以前と同様に、$?トラップへのエントリをチェックする必要があります。139は、プログラムがこのステータスを返したことを意味する場合があります(ほとんどありません)。


6

から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はを取得します。

ただし、$?いくつかの条件付きでtrap に格納されているexitcodeを使用できますSIGCHLD

trap 'if [[ $? -eq 139 ]]; then echo "segfault !"; fi' CHLD

set -bmこれ(おそらく何をするか)が非対話型bash(スクリプトなど)で使用される場合に必要になる可能性があることに注意してください。

編集:およびを使用した同様の問題については、この(ギレスの)回答も参照してください。bashtrap


変なことが起こります。トラップを使っtrap "echo 'something happened!'" {1..64}てもまだ何も得られません。私もでtryied set -bmset -o monitorけど灘。
ピティコス

これをインタラクティブに試しましたか?trap "echo 'something happened'" {1..31}私にとっては機能します(!およびにつながる信号仕様を除外bash: trap: XX: invalid signal specification
sr_
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.