web-dev-qa-db-ja.com

ダイアログ、トラップ、SIGTRAP

次のように、ダイアログツールを使用して行のあるスクリプトを作成する例をたくさん見てきました。

trap "rm $datafile" 0 1 2 5 15

私が理解していないのは、SIGNAL 5の意味です。わかりました、SIGTRAPです。でも恥ずかしいけど、それでも本当の意味がわからない….

前もって感謝します!!

5
sebelk

マンページがありますsignal(7)

_Signal         Value   Action   Comment
SIGTRAP        5        Core    Trace/breakpoint trap
_

このシグナル(マンページが示唆しているように)は、主にgdbstrace、それぞれptrace(2)システムコールなどのデバッグツールによって使用されます。あるプロセスがptrace(2)を介して別のプロセスのアクティビティをトレースしている場合、ほとんどの場合、子供はこれが起こったことを効果的に認識していなくても、SIGTRAPは子供を「中断」するために頻繁に使用されます(aトレーサーは配信されたシグナルを傍受してフィルタリングできるため、ptrace(2)を介して監視されるプロセスは、どのシグナルが送信されたかを必ずしも認識しません。SIGTRAPは、主にトレーサーに注目すべき何かを通知するのに役立ちます。起こりました)。

この場合、ptrace(2)のマンページを見ると非常にわかりやすくなります。

6
Andreas Wiese

その本当の意味がわかりません

それがどのように引き起こされ、使用されるかを見てみましょう。

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
  • nASMの特別な1バイト長のエンコーディングint3

1バイト長のエンコーディングはGDBの基本です。命令が1バイトより大きい場合、複数の命令を上書きする可能性があり、面倒になります。