次のように、ダイアログツールを使用して行のあるスクリプトを作成する例をたくさん見てきました。
trap "rm $datafile" 0 1 2 5 15
私が理解していないのは、SIGNAL 5の意味です。わかりました、SIGTRAPです。でも恥ずかしいけど、それでも本当の意味がわからない….
前もって感謝します!!
マンページがありますsignal(7)
:
_Signal Value Action Comment
SIGTRAP 5 Core Trace/breakpoint trap
_
このシグナル(マンページが示唆しているように)は、主にgdb
やstrace
、それぞれptrace(2)
システムコールなどのデバッグツールによって使用されます。あるプロセスがptrace(2)
を介して別のプロセスのアクティビティをトレースしている場合、ほとんどの場合、子供はこれが起こったことを効果的に認識していなくても、SIGTRAP
は子供を「中断」するために頻繁に使用されます(aトレーサーは配信されたシグナルを傍受してフィルタリングできるため、ptrace(2)
を介して監視されるプロセスは、どのシグナルが送信されたかを必ずしも認識しません。SIGTRAP
は、主にトレーサーに注目すべき何かを通知するのに役立ちます。起こりました)。
この場合、ptrace(2)
のマンページを見ると非常にわかりやすくなります。
その本当の意味がわかりません
それがどのように引き起こされ、使用されるかを見てみましょう。
SIGTRAPの主な原因は、int3
命令です。
これは次の方法で確認できます。
int main() {
asm("int3");
return 0;
}
出力を実行すると、次のようになります。
Trace/breakpoint trap (core dumped)
終了ステータスは133
= 128 + 5であるため、シグナル5、SIGTRAPです。
GDBは、テキストセグメントにint3
命令を挿入し、ptrace
を設定して、プログラムを実行させます。 int3
に達すると、ptrace
は親を起動し、子の状態を監視できます。
異なるメカニズムを持つハードウェアブレークポイントもあることに注意してください: ハードウェアブレークポイントとソフトウェアブレークポイントの違いは何ですか?|スタックオーバーフロー
int3の詳細
int3
には2つのエンコーディングがあります。
int
プレフィックス+ 3
は2バイトを使用し、NASMではint 3
int3
1バイト長のエンコーディングはGDBの基本です。命令が1バイトより大きい場合、複数の命令を上書きする可能性があり、面倒になります。