2011-07-13 2 views

答えて

6

カーネルではなく、原因をアプリケーションで調べる必要があります。

通常、プロセスはabortを直接コールするか、またはassertが失敗したときにSIGABRTを受け取ります。シグナルを配信するカーネルの部分を正確に見つけることで、何も得られません。

結論として、あなたのコードまたはあなたのコードが使用しているライブラリがこれを引き起こしています。 abort(3)およびassertを参照してください。

1

シクタルの答えが最善の推測IMHOです。

SIGBARTの場合には、abort(3) libc関数を介してシグナルを受け取るプロセスと同じプロセスからシグナルが放出される可能性がありますが、シグナルが別のプロセスによって放出されている可能性があります。

strace -e kill yourapp you args ...でアプリケーションを実行して、killシステムコールがプログラムまたは依存ライブラリから実際に呼び出されたかどうかを素早く確認できます。または、gdb catch syscallを使用してください。

悪意のある「OOMキラー」が動いたときに、カーネル自体がSIGKILLのような信号を発することがあることに注意してください。

ところで、シグナルは非同期で配信されるため、プログラムの通常のワークフローが妨げられます。このため、彼らは追跡するのが苦痛です。 SystemTapのような機械の他に、私はカーネル内で信号の放出と配送を追跡する方法やロギングする方法を知らない。

+0

'abort'は、その信号を同期して送ります。必要なのは、コアダンプか、デバッガの下で実行され、呼び出されている場所を正確に見つけることだけです。 – Nemo

関連する問題