2

数値ライブラリをコンパイルするためにIntelのFORTRANコンパイラを使用しています。テストケースでは、libc.so.6内でエラーが発生しました。Intelのデバッガー(IDB)を接続すると、アプリケーションは正常に実行されます。デバッガーがバグを防止するバグをデバッグするにはどうすればよいですか?同じバグがgfortranで発生したことに注意してください。

私はOpenSUSE11.2x64内で作業しています。

エラーは次のとおりです。

forrtl:severe(408):fort:(3):配列Bの添え字#1の値は-534829264であり、これは1の下限よりも小さい値です。

4

2 に答える 2

3

エラーメッセージは私にはかなり明白です。配列の存在しない要素にアクセスしようとしています。初期化されていない変数を使用して配列内の要素を識別する場合、値-534829264がジャンクであるか、整数の算術オーバーフローの結果であると思われます。どちらの方法でも、コンパイルフラグをオンにして、配列の境界チェックを強制し、いくつかのテストを実行する必要があります。Intelコンパイラのフラグはと思いますが-CB、ドキュメントを確認してください。

プログラムがデバッガーで正常に実行される理由については、あまり役に立ちませんが、おそらくデバッガーは、ランタイムシステム自体が適用しないデフォルト値を変数に課します。または、他の何らかの要因が完全に責任を負います。

編集:

ランタイムシステムは、問題の原因となるコード行を教えてくれませんか?問題を診断するためにさらにいくつかのこと。コンパイラを使用して警告します

  • 初期化される前の変数の使用。
  • 整数算術オーバーフロー(コンパイラがこれを検出できるかどうかわからない?);
  • 同じタイプ内で、あるタイプから別のタイプへ、およびある種類から別の種類への強制変換。

また、デフォルトの整数サイズが期待どおりであること、さらに重要なこととして、コードの残りの部分が期待どおりであることを確認してください。

于 2010-05-17T10:28:58.040 に答える
1

この分野の専門家ではありませんが、考慮すべき点がいくつかあります。

1)デバッガーは最初にインデックスとして使用される変数をゼロに初期化しますが、非デバッグはそうではないため、変数は「ジャンク」値で始まります(以前はそれを行っていた古いバージョンのPascalがありました)。

2)スレッドを使用していますか?もしそうなら、デバッグは実行の順序を変更するので、いくつかの準備スレッドは時間内に完了します。

于 2010-05-17T10:29:44.077 に答える