web-dev-qa-db-ja.com

コアダンプファイルが生成されるのはなぜですか?

コードを実行すると、プログラムを終了するとコアダンプファイルが生成されることがあります。 Ctrl+\。ファイル名の形式はcore.*です。プログラムは突然終了せず、セグメンテーション違反はありません。 SIGQUITSIGABRTではなく、SIGSEGVだと思います。私がしようとすると Ctrl+C、または Ctrl+Zの場合、生成されません。

なぜそれがいつのみ生成されるのか、誰かが言うことができますか Ctrl+\ 押された?このコアダンプファイルが生成されないようにするにはどうすればよいですか?コアダンプファイルの用途はありますか?

16
Chaithra

プロセスは、プログラムの障害が原因でオペレーティングシステムによって終了されると、コアをダンプします。これが発生する最も一般的な理由は、プログラムが無効なポインター値にアクセスしたためです。散発的なダンプがある場合、初期化されていないポインタを使用している可能性があります。

障害の原因となっているコードを投稿できますか?漠然とした一般化以外に、実際にコードを見ずに何が悪いのかを推測することは困難です。

コアダンプの実際については、次のWikipediaの記事をご覧ください。

24
JaredPar

コアダンプの前に他の人が言ったように、プログラムの障害の結果です。

limit コマンドでコアダンプを生成するかどうかを構成できます。入り

ulimit -c 0

アクティブなシェルでコアファイルの生成を無効にします。

コアを生成したプログラムがシンボル情報を使用してビルドされている場合は、次のように 事後デバッグセッション を実行できます。

gdb <pathto/executable> --core <corefilename>
12
lothar

コアダンプは、プロセスがSIGSEGVなどの特定のシグナルを受信すると生成されます。カーネルがアドレススペース外のメモリにアクセスすると、シグナルが送信されます。通常、これはポインタの使用方法のエラーが原因で発生します。つまり、プログラムにバグがあるということです。

コアダンプはバグを見つけるのに役立ちます。これは、問題発生時のプロセスのメモリのイメージであるため、gdbなどのデバッガを使用して、プログラムが何をしていたかを確認できます。デバッガは、プログラム内の変数の値に(場合によっては)アクセスすることもできます。

Ulimitコマンドを使用して、コアダンプが発生しないようにすることができます。

8
user25148

ctrl + \ シグナルSIGQUITをプロセスに送信します。 POSIX.1標準によれば、この信号のデフォルトアクションはコアを生成することです。

SIGILL、SIGABRT、SIGFPE、SIGSEGVは、システムがコアを生成する他のケースです。

詳細については、システムの「man 7 signal」を参照してください。

6
Onkar

これは、動作の悪いアプリケーションのデバッグを支援するツールです。それは、それが死んだ時点でのすべてのアプリケーションの物理メモリの内容、およびそのすべてのスレッドのレジスタの状態とスタックを含んでいるため、大きくなります。

これらは、セグメンテーション違反やバスエラーの生成など、悪事を行うためにカーネルがアプリケーションを強制終了したときに生成されます。

6
Jason Coco

クラッシュしないコードを記述することで、コアダンプファイルの作成を回避できます。

コアダンプは、クラッシュ後のプログラムの状態を確認できるので、「事後分析」のデバッグに役立ちます。それらをgdbで開いて、プログラムの状態を検査できます(特に、デバッグでビルドされている場合)。

コアダンプは通常、プログラムにSIGSEGV(通常は無効なポインター逆参照が原因)、SIGABRT(abort()を呼び出した場合、またはC++でデストラクタなどの例外のデフォルトのterminate()ハンドラーによって発生する)またはその他の不具合。デバッガーを使用して明示的に、またはプログラムでトリガーすることもできます。

すべてのバグを修正して問題がなければ、削除することができます。また、プログラムをなんらかの方法で変更(および再コンパイル)した場合、デバッグ情報がコアダンプの内容と一致しなくなるため、プログラムは役に立たなくなります。削除することもできます。

3
MarkR

のポイント Ctrl\ コアダンプを生成することです。それがSIGQUITが行うことです。生成したくない場合は、 CtrlCSIGINT)代わりに。問題のプログラムがSIGINTに応答していなくても、ターミナルからそれを強制終了する必要がある場合は、あなたまたは開発者のいずれかが何か間違っています。

設計されたプログラムnotでターミナルから強制終了する CtrlC それでもSIGTERMに正常に応答するはずです。これはkill -TERM ...を介して別の端末でトリガーできます。他のすべてが失敗した場合、SIGKILLは即座に強制終了します。

1
Zenexer