Linux:シグナル4に関するコアダンプ

Linuxプラットフォームでは、私のアプリケーションプログラムは時折シグナル4によってコアダンプを受け取りました。そして、シグナル4が不正命令を意味することがわかりました。 だから私は1つの質問があります: 不正な命令を得る方法とシグナル4のコアダンプを引き起こす原因

1

2 答え

より頻繁に使用できるのは、初期化されていないか破損している関数ポインタ(またはC ++のvtable)の使用です。

Cコードが破損した関数ポインタを呼び出すと、そのアドレスは、プロセッサが実行しようとしたときにSIGILLシグナルを与えるデータの中など、どこにでもつながります。

また、ラベルを値として使用し、計算された goto * x; (悪意のあるアドレスにジャンプする場合、Cによく使用されるGCC拡張)

リターンアドレスを上書きするためにコールスタックを壊してしまった場合でも、それが起こる可能性があります。

おそらく、あなたの gdb デバッガ(またはおそらく valgrind )を使って助けてください。

私のアドバイスは、常に関数ポインタを含むポインタを(例えばNULLに)初期化することです。 IIRCでは、NULL関数ポインタを呼び出すと、SIGSEGVが得られます。

5
追加された

別のプロセッサモデル用にコードをコンパイルしたか、別のプロセッサモデル用のコードをインストールしている可能性があります。計算集約型の作業をスピードアップするために、現代のCPUでの印象的な SIMD の命令の巨大な様々な(MMXがあります。 、SSE2、SSSE3、SSE4.1、SSE4.2、3dNOW!(およびその派生物))、より速いシステムコールのための命令、より速いロック処理(popcnt)のための命令、AESのラウンド計算のための命令など。

おそらくあなたのコードは、これらの命令のいくつかが利用可能であると仮定してコンパイルされましたが、あなたのCPUはそれらをサポートしていません。

もう1つの可能性は、悪いメモリまたはハードドライブ上のデータの破損です。 memtest86 は悪いメモリを見つけるのに役立ちます。また、 debsums rpm -qV または同様のパッケージマネージャコマンドを使用して、プログラムが最初にインストールされたときのチェックサムと一致するかどうかを確認します。

3
追加された