1

組み込みの MIPS Linux アプリからのコア ダンプを見ています。GDB は SIGBUS を報告しており、シグナルを処理するスレッドは nanosleep の syscall に置かれているように見えます。より高いレベルのコードは基本的に sleep(verylongtime) と呼ばれます。別のプロセスがそのシグナルをアプリに送信しなかったと仮定すると、このスレッドがこのように起動される原因は何でしょうか? カーネル内の何かがバス エラーを生成しましたか? そのようなシグナルをブロックする別のスレッドによって引き起こされた可能性はありますか? (ここで素朴なことをお許しください。私は信号についてあまり詳しくありません)。ありがとう。

4

1 に答える 1

3

がアドレスに設定されている場合si_pid、これは SIGBUS がプログラムの障害によって発生したことを意味します。通常、これは、カーネルがプログラム テキストをページインしようとしたときに IO エラーが発生した場合に発生します。スタック オーバーフローもこれを引き起こす可能性があります。

は共用体の一部であり、 でエイリアス化されてsi_pidいるため、アドレスに設定されていることがわかります。特に、は の場合にのみ有効です。メンバーからより多くの情報を入手できる場合があります。si_pidsi_addresssi_pidsi_code == SI_USERsi_code

   The following values can be placed in si_code for a SIGBUS signal:

       BUS_ADRALN     invalid address alignment

       BUS_ADRERR     nonexistent physical address

       BUS_OBJERR     object-specific hardware error

       BUS_MCEERR_AR (since Linux 2.6.32)
                      Hardware memory error consumed on a machine check; action required.

       BUS_MCEERR_AO (since Linux 2.6.32)
                      Hardware memory error detected in process but not consumed; action optional.

カーネルから発信された SIGBUS シグナルをブロックすることはできないことに注意してください。ブロックしようとすると、とにかくプログラムが終了します。

あなたのデバッガーは、ここでの SIGBUS シグナルの発信元について少し混乱しているかもしれません。間違ったスレッドに起因している可能性があります。プロセスの他のスレッドを調べて、異常なことをしていないかどうかを確認することをお勧めします。nanosleepまたは、 から戻り、戻りアドレスでコードのページをページングするときに IO エラーが発生した可能性があります。

于 2011-09-26T20:48:09.370 に答える