2

現在問題が発生しています

*** glibc detected *** ./efit: free(): invalid next size (fast): 0x00000000006127f0 ***

エラーが発生した通常のメモリ マップとバックトレース情報を使用しglibcます。ただし、この問題の原因を見つけることができません。これが発生するまでに、(基本的に)私のプログラム全体が終了しているようです。私がオンラインで読んだことの1つは、これは解放の欠如が原因である可能性があるということです.

現在、いくつかの配列の割り当てを解除せずにプログラムを実行しています (割り当て解除はメモリ リークを引き起こす可能性があるという印象を受けましたが、これは実行中のプログラムのパフォーマンスと効率にのみ影響します)。今、プログラムを新たに起動すると、このエラーが発生します。

配列の割り当てを解除せずにプログラムを以前に実行したことが、書き込みしようとしている以前の実行から解放されていないメモリがあるという意味で、「私を悩ませに戻ってくる」可能性はありますか?

そうでない場合、このエラーに完全に混乱しています。どこを見始めるべきか、および/またはそれを見つけるためにデバッグする方法についての手がかりはありますか?

価値があるので、gfortranを使用してコンパイルしています

EDIT:コンパイルオプションは最初はこの問題を直接特定しませんでしたが、それを取り除くのに役立ちました. i はループ内で整数変数iatforを使用していましたが、数行後、の境界内で別の整数を記述していると考えられました。配列の境界外の配列を参照していました。コンパイル オプションによってリストされたいくつかの警告を修正したところ、このエラーはエラーのより明確な説明に変わりました: .iat=1,natomsdoiat1,natomsFortran runtime error: Index '7' of dimension 1 of array 'isnormed' above upper bound of 6

このエラーが最初に生成されなかったのは何が原因でしたか? コンパイル警告が教えてくれた私が行った唯一のリーチ変更は、read(fout, '(a)'), line100' toread(fout, '(a)') line100' の変更 (コンマの削除) と、古いスタイルの文字の説明character*100 line100を新しいcharacter(100) line100説明に変更することでした。

4

2 に答える 2

1

プログラムの前回の実行によるエラーは、次の実行に影響を与えることはできません。OS は実行可能ファイルの新しいバージョンをロードし、メモリを提供します。プログラムに情報をファイルに書き出させ、次の実行時にそれを読み取らせた場合にのみ、情報の転送を行うことができます。

プログラムが終了すると、メモリは OS によって自動的に割り当て解除されます。さらに、Fortran >=95 の場合、プロシージャにローカルな割付け配列は、プロシージャが戻るときに Fortran によって自動的に割り当てが解除されます。

ほとんどの場合、プログラムで使用されるメモリを記述する内部構造を破壊するメモリ使用の問題があります。Fortran では、これは、呼び出し元と呼び出し先の間で引数を一致させないこと、配列の末尾を越えてインデックスを作成すること、またはポインターを使用することによって可能になります。ポインターを使用していますか?そうでない場合、最初の 2 つは通常、この時代では簡単に防ぐことができます。プロシージャをモジュールに配置し、それらのモジュールを「使用」します。これにより、コンパイラは引数の一貫性をチェックできます。添え字の実行時チェックのオプションを指定してコンパイルします。これにより、配列の末尾を超えてインデックスを作成し、他のメモリに格納しているかどうかがわかります。

gfortran では、次のコンパイラ オプションを試してください。衒学的な-fbacktrace。これらのいくつかであまりにも多くの警告が識別された場合、この問題で重要なのは fcheck=all、またはさらに狭い範囲では fcheck=bounds です。

于 2012-07-04T20:36:23.940 に答える
1

このメッセージは、割り当て解除の失敗に関するものではありません。ヒープが壊れていると言っています。これには多くの方法がありますが、配列を解放するのを忘れることはその 1 つではありません。これが Fortran コードである場合、配列が正しく宣言されていない可能性があります。

メッセージはglibc、整合性チェック時に生成されています。したがってメッセージが表示されるタイミング (実行の開始時または終了時) は、メッセージが表示される前のある時点 (ただし、いつでも発生する可能性があります) で破損が発生したことがわかっている場合を除き、関係ありません。

破損したヒープは、プログラムが生成している回答が、完全に正しいものからまったく役に立たないものまでさまざまであることを意味します。このメッセージを取り除く必要があります。

(私は、割り当て解除がメモリリークを引き起こす可能性があるという印象を受けましたが、これは実行中のプログラムのパフォーマンスと効率にのみ影響します

これは後方です。解放が行われないと、メモリ リークが発生します。

valgrind最善の方法は、ヒープの問題を詳細に検出して報告するように設計されたツールを使用することです。

于 2012-07-04T20:25:11.580 に答える