2011-01-15 11 views
3

私は今このエラーを数時間デバッグしています。私はOgre3dを使ってプログラムを書いています。なぜならシンボルをロードしないので、クラッシュの場所を見つけることをより困難にしていたトレースをスタックさせることができないからです。だから、特定の関数を呼び出す前に "Starting"を印刷して関数を呼び出し、 "Stopping"を印刷した直後に書き込みます。関数全体を通して、関数Fが関数が返る直前(最後の '}'の1行上)に文字AFを印刷します。奇妙なことは、 'F'が印刷された後にクラッシュが発生したときですが、 'これは、クラッシュがどこかで起こっていることを意味しますか?私が考えることができる唯一のことは、関数中に割り当てられたメモリの一部を解放している間に何かがうまくいかないことです。私はこのようなことは一度も起こったことがない、私はそれが間違っていると確かめるためにチェックを続けます。戻り値関数がクラッシュする原因は何ですか? C++

+2

すべての種類のもの。関連するコードを表示してみませんか? –

+0

何でもかまいません。迷惑ポインタを介してスタックを乱されますが、デストラクタが呼び出されて表示されるバグのように聞こえます。可能な限り小さなプログラムで問題を再現してください。コードを投稿する(プロセスがバグを発見しなかった場合)。乾杯、 –

+0

コードを投稿していないと何も教えてくれません。 – Puppy

答えて

4

何か変わったことや理解できないことが起こった時代の大部分は、何か他のものが原因です。

dangling pointersは、ランダムメモリセルを指しているコード(その機能から遠く離れた場所でさえも)に含めることができます。

このようなダングリングポインタを使用した可能性があり、必要なメモリセルが上書きされている可能性があります。その結果、他の場所で定義された変数や定数、あるいはコードを変更してプログラムの動作を変更しました!

Valgrindのような誤ったメモリアクセスをチェックして報告できるツールを使用してアプリケーションをデバッグすることをお勧めします。それが聞こえるものの、それはあなたの関数では、単純なエラーの可能性があり - あなたのクラッシュのソースをローカライズするために、ここでポストそれをクラッシュするコードの本当に小さな作品を書くことができますとにかく場合


おそらく、あなたの説明から。

+0

私は下に述べたように、私は索引配列の外でメモリに書き込んでいました(私は100のスペースを割り当て、それ以上のインデックスに書き込みました)が、これはクラッシュの原因ではなかった、それは私が推測しているそのフレームの外側でスタックを台無しにして、それが戻ったときすべてが台無しになった。私はなぜ私がそのデータで遊ぶことができたのか混乱しています。 – JeanOTF

+0

C++は管理された言語ではありません。コンパイラはできる限り静的にチェックしようとしますが、ランタイムチェックは実行されません。あなたのエラーは実行時に発生します(コードを静的に解析すると、_right_配列要素だけにアクセスするかどうかはコンパイラが判断できません)。 Valgrindは、実行時に何が起こっているかをチェックするツールです。基本的には、管理対象言語の仮想マシンの機能の一部です。 – peoro

+0

ええ、私は過去に私が場所外のメモリにアクセスしたときに、アクセスされたメモリが私のプログラムに割り当てられたものではなかったためにsegフォールトが発生すると思います。私の年のプログラミングでは、関数内のヒープベースの配列多分それはそれだった。 – JeanOTF

2

おそらくは、関数が復帰していくつかのデストラクタが起動しているときにエラーが発生していることを示します。可能であれば、所有していないメモリを解放しようとするデストラクタがいくつかあります。ログのバッファの末尾を書き留めておいてください。

フラッシングしていないと気付く可能性があります出力ストリーム。 「停止中」が印刷されている可能性がありますが、stdoutを押す前にバッファリングされている可能性があります。それがあなたの間違った木を吠えることになるので、これをチェックすることを確認してください。

+0

それは何かを発見しました。私は配列(100の大きさ)のためのスペースを割り当てていましたが、私は100を超えてインデックスされた値を修正していました。変わった部分は、これが問題ではありませんでした。私はそれが解放かより具体的には私がフレームレジスタの外のメモリに書き込んだ(私が推測している)事実であるかどうかは分かりません。 – JeanOTF

+0

@ JeanOTF-その場合、おそらく割り当てられたブロックのフッターにいくつかのデータが上書きされています。メモリアロケータがそれを再利用しようとすると、何らかの内部データ(たとえば、次のブロックへのポインタ)を見つけることが予想され、代わりにゴミが見つかったため、おそらくクラッシュが発生しました。これはいつも起こります。 – templatetypedef

関連する問題