組み込みの MIPS Linux アプリからのコア ダンプを見ています。GDB は SIGBUS を報告しており、シグナルを処理するスレッドは nanosleep の syscall に置かれているように見えます。より高いレベルのコードは基本的に sleep(verylongtime) と呼ばれます。別のプロセスがそのシグナルをアプリに送信しなかったと仮定すると、このスレッドがこのように起動される原因は何でしょうか? カーネル内の何かがバス エラーを生成しましたか? そのようなシグナルをブロックする別のスレッドによって引き起こされた可能性はありますか? (ここで素朴なことをお許しください。私は信号についてあまり詳しくありません)。ありがとう。
1096 次
1 に答える
3
がアドレスに設定されている場合si_pid
、これは SIGBUS がプログラムの障害によって発生したことを意味します。通常、これは、カーネルがプログラム テキストをページインしようとしたときに IO エラーが発生した場合に発生します。スタック オーバーフローもこれを引き起こす可能性があります。
は共用体の一部であり、 でエイリアス化されてsi_pid
いるため、アドレスに設定されていることがわかります。特に、は の場合にのみ有効です。メンバーからより多くの情報を入手できる場合があります。si_pid
si_address
si_pid
si_code == SI_USER
si_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 に答える