web-dev-qa-db-ja.com

C ++プログラムが終了コード9(SIGKILL)でクラッシュする

アプリケーションプログラムが終了コード9(SIGKILL)でクラッシュする

「kill -9(pid)」や「pkill(process name)」など、実行中のプロセスを強制終了できるコマンドは実行しません。

この場合、どこからデバッグを開始すればよいですか?

  1. プログラムがクラッシュしたときにスタックトレースをダンプしようとしましたが、エラー処理のためにSIGKILLをキャッチできないことがわかりました。

  2. プログラムはMPIを使用し、クラスター環境で実行されます。実行の約1時間後に終了します。

SIGKILL例外が発生する可能性のある共通の原因はありますか?

(Linuxで実行中、cent os 7)

12
syko

@誰かが後で助けを得ることができるように、私は自分の質問に答えます。

例外はOutOfMemoryが原因で発生しました。

プロセスが割り当てるメモリが多すぎるため、OSに負荷がかかります。 OSにはヒットシステムoom-killerがあり、システムの安定性のためにこのようなプロセスを強制終了します。 oom-killerはSIGKILLと呼ばれる弾丸を使用します。

ただし、SIGKILLは目に見えないため(アプリケーションでキャッチして処理することはできません)、私を含む一部の初心者にとって、クラッシュの本当の理由を把握するのは必ずしも容易ではありません。

良いニュースの1つは、攻撃者がプロセスを強制終了すると、そのアクションを常に/ var/log/messagesに記録することです。

OSの構成によっては、oom-killerはメッセージをまったく記録しない場合があります。このような場合、同様に構成できます。 Googleでrsyslog設定を検索します。

Linux OOMキラーによって強制終了されたプロセスを見つける

20
syko