2011-08-08 17 views
1

g ++でコンパイルされたlinuxで実行されているC++プログラムが、ある時間が経過して不正な命令例外が発生し、コアダンプが発生するという問題があります。 gdbを使用してバックトレースを行うと、私は得るでしょうg ++でコンパイル中に不正な命令が発生する

(gdb) bt 
#0 0x005e18cf in ATL_dpotrfL() from /usr/lib/liblapack.so.3gf 
#1 0x00000001 in ??() 
#2 0xb786f2e8 in ??() 
Backtrace stopped: previous frame inner to this frame (corrupt stack?) 

私はバックトレースにメインがない理由はわかりません。 ?デバッグシンボルが入っていない私のlinuxライブラリの一部であるようです。

私の質問は今ですか?このプログラムの問題は何ですか?図書館のラップは誤ってコンパイルされていますか(私は数日前にそれをコピーしました)?または他のエラーがありますか?

私は確かにアセンブラやそれに類するものはありませんでした。 C++のみ。通常壊しスタックを意味

おかげ クリスチャン

+0

スタックが破損したように見えます。 valgrindの下で実行します。 –

+0

それでは、どうすればいいですか?ただvalgrind ./binary?私はvalgrindをまだ使用していませんでした。どのツールを起動すればよいですか?私はvalgrindがメモリリークのために使われていると思った。 –

+0

さて、 'valgrind。/ binary'で始まり、それが何を言うのかを見てください。 –

答えて

7

。特に0x00000001の値は、有効なスタックアドレスではない可能性が非常に低いので、スタック割り当てバッファをオーバーフローさせてリターンアドレスを上書きしたとします。

+0

問題のあるコードを取得するにはどうすればよいですか?私にヒントを与えるツールはありますか?ありがとうございます –

+0

@Christian:スタックを壊してしまった場合、スタック上の現在の関数のアドレスはどうやって見つかりますか?壊れている。あなたがする必要があるのは、プリミティブ配列の使用をやめ、 'boost :: array 'のような安全な配列テンプレートを使い始めることです。 – Puppy

+1

@DeadMG: 'boost :: array 'は 'reference | const_reference演算子[]'のためのno-throwを保証します。したがって定義上はチェックできません(移植可能で、debug-buildsは別の話です)。 http://www.boost.org/doc/libs/1_47_0/doc/html/boost/array.htmlを参照してください。 –

2

DeadMGは言っても、プラス何か:

不正な命令は通常、ランニングマシンでは使用できないCPU命令を使用するようにコンパイルされたバイナリの結果です。あなたは

g++ -msse4 ... 

のようにコンパイルして、SSE4命令セットをサポートしていないインテルのAtom CPU、上のことを実行する場合、これは、たとえば起こることができます。クラッシュは必ずしも起こらない。

int main() {} 

SSE4命令が生成されている間は、そうではありません。予想外のコードパスに対しても同様ですが、将来クラッシュすることはありませんが、将来はクラッシュすることはありません。

スタックスムージングコードを見つけるには、cppcheck or similar,ValgrindのようなLINT、分かりやすい古いprintf/coutデバッグ、またはチェックされたSTL実装を使用すると考えられます。

2

他の人が言っているように、あなたはおそらくあなたのスタックをねじ込んでいます。

最も一般的な原因は次のとおりです。

スタック上の巨大なローカルデータを宣言尖った空間外

  • を書い悪いポインタ(すでに削除)
  • への書き込み原因を見つけるための魔法の方法は:

    valgrind your_program [args] 
    

    (通常は起動するコマンドの前に「valgrind」を追加するだけです。もしvalgrindをまだインストールしていないのであれば、ディストリビューションのパッケージは広く使われているので、ディストリビューションのパケットが必要です。)

    それでvalgrindは実行中のプログラムを検査してしまいます。 (例えば、スタック上に)書込みが行われないようにします。

  • 関連する問題