2011-01-26 8 views
3

私はLinux上で長いプログラムを持っているので、メインリターンの後にセグメンテーションフォルトが発生します。 その長いプログラムなので、投稿できません。それで、そのようなエラーを作り出すことができるのですか?メイン返信後のセグメンテーションフォールト

ありがとうございます。

うわー、それらの答えは本当に速かった。皆さん、ありがとうございました。 私はそれをうまく処理したと思います。文字列をmallocに忘れてバッファとして使用しました。 私はそれをmallocedしたので、セグメンテーションエラーで私に信号を送ることはありません。

もう一度、ありがとうございます。

+0

このスレッドを試してください:http://stackoverflow.com/questions/3718998/methodology-for-fixing-segmentation-faults-in-c – CanSpice

+0

見るべき一行のコードを持たずに、ランダムな答え。しかし、一般的には、ポインタ関連のもの(バッファオーバーフローを含む)またはスタックの破損です。 –

+0

main関数をvoidを返すと宣言しましたか? –

答えて

1

GDBを使用し、スタックトレースをSIGSEGV信号で出力します。その後、少なくとも投稿そのここで私たちはもう少し役に立つことができます。

$ gcc -g prog.c -o prog 

その後GDBの下でそれを実行します:

$ gdb ./prog 
gdb> r 

あなたはSIGSEGV信号(セグメンテーションフォールト)を取得する場合、この操作を行います。その後

gdb> bt 

をあなたがしてコンパイル提供

スタックトレース上にあるものを参照して、セグメンテーション違反の原因を調べます。

3

推測:メインのスタックが偶然破損して、返却先アドレスが失われている可能性があります。そこに文字列バッファーがありますか?

ない場合は、試してみてください:

  • がクラッシュをキャッチし、あなたはその時点でいる場所を確認するためにGDBを使用してプログラムをデバッグするvalgrindの
  • の下でプログラムを実行しています。ダンプされたコアファイルをデバッグすることもできます

glibc-debugパッケージをインストールするには、その時点でglibcコードを使用しているので、ディストリビューションにそれらがある場合は役立ちます。

1

main()が復帰した後にセグメンテーション違反が発生した場合、通常、グローバルに定義されたものが間違っていたことを意味します。小さな情報であなたを助けるのは難しいです。私たちにもっと情報を送ってください!

MY2C

1

それはmain()戻った後なら(私はこの一部をごまかすために、実装を過ぎてそれを入れていないだろうが)機能atexit()が使用されていない限り、[標準に従ってすべてのデストラクタが実行されています。この関数は、main()が返した後に呼び出される関数を登録します(私が3.6.3を読んでいる場合)。完全性のためにのみ、プログラム内にatexitがあるかどうかを確認することができます。

「メインリターン後」という意味に応じて、プログラムがクラッシュしたときに静的オブジェクトのデストラクタを実行している可能性があります。それらをチェックしてください。 (また、あなたがそれがmain()が返された後であったと思うようにしたことをあなたが観察したものを投稿します。)

もしそうでなければ、どこかで未定義のビヘイビアが呼び出されています。何とかスタックを破壊する可能性が非常に高いです。 Rupの答えを見てください。

関連する問題