0

リモート Linux サーバーでプログラムをコンパイルしています。プログラムがコンパイルされました。しかし、実行すると、プログラムが突然終了します。そこで、DDT を使用してプログラムをデバッグしました。次のエラーが吐き出されます。

    Process 0:
    Memory error detected in ClassName::function (filename.cpp:6462).
    Thread 1 attempted to dereference a null pointer or execute an SSE instruction with an 
    incorrectly aligned memory address (the latter may sometimes occur spuriously if guard 
    pages are enabled)
    Tip: Use the stack list and the local variables to explore your program's current 
    state and identify the source of the error.

このエラーの意味を正確に教えてください。

プログラムが停止する行は次のようになります。

    SumUtility = ParaEst[0] + hhincome * ParaEst[71] + IsBlack * ParaEst[61] + IsBachAss * (ParaEst[55]);

スイッチケースに入っています。

これらは変数タイプです

    vector<double> ParaEst;
    double hhincome;
    int IsBlack, Is BachAss;

助けてくれてありがとう!

4

2 に答える 2

2

だということだ:

  1. ParaEst が NULL または不正なポインタです
  2. ParaEst の個々の配列値は、SSE に必要な 16 バイト境界に揃えられていません。
  3. hhincome、IsBlack、または IsBachAss は 16 バイト境界に整列されておらず、SSE タイプの値です。
  4. SumUtility は 16 バイトにアラインされておらず、SSE タイプのフィールドです。

失敗した正確な行のアセンブリ コードをそのアセンブラー行のレジスタ値と共に投稿していただければ、上記の条件のどれが失敗したかを正確に伝えることができます。原因を絞り込むのに役立つ、表示されている各変数のタイプを確認することも役立ちます。

于 2012-05-17T16:41:30.780 に答える
0

わかりました...問題は最終的に修正されました。

問題は、コードが壊れていた式が新しく定義された関数にあったことでした。しかし、奇妙な理由により、メイクファイルを実行してもこれらの変更が組み込まれず、以前にコンパイルされた .o ファイルを使用してコンパイルされていました。これにより、この新しい関数内の変数にガベージ値が割り当てられました。プログラムを締めくくるには、最初のステップとしてこの関数を呼び出します。したがって、この体系的な崩壊がありました。これの技術的な側面は、マイケルがほのめかしたものでした.

この後、make ファイルで make clean オプションを使用することを常にお勧めします。make ファイルを実行しても変更されたソース ファイルのコンパイルに失敗する理由は、さらに議論する必要がある問題です。

回答ありがとうございます!!

于 2012-05-18T23:19:49.387 に答える