-6

FORTRAN コードの一部の割り当て解除と割り当てに問題があります。特に、この問題は、Web 上のエラー メッセージの検索からのメモリ割り当てに関係していると思います。エラーメッセージは無効なポインターについて述べていますが、プログラムでポインターを使用していません

f ループの反復 # 2 (以下を参照) を完了した後、プログラムがクラッシュするか、ほとんどの場合クラッシュし、フリーズすることもあります。これがバグのポイントであると確信しています。プログラムはこの時点まで実行されます。

表示されていないサブルーチンがありますが、それらは他のシミュレーションの組み合わせで機能するため、問題がないと確信しています。私はプログラム内の他の場所で deallocate と allocate を (成功して) 使用しているので、ここで機能していないことに驚いています。

読みやすくするために、プログラムの一部のみを示しています。特に、私が書いたサブルーチンへの呼び出しを削除しました。プログラマーが問題を解決するのに十分な情報を提供できたことを願っています。そうでない場合は、他に必要な情報を指定してください。喜んで対応させていただきます。さまざまなコンパイラ オプションを使用してプログラムをコンパイルし、いくつかのバグを修正し、警告をすべて削除しました。ただし、この時点では、コンパイラ オプションからはそれ以上の情報は得られません。

allocate(poffvect(1:6))
allocate(phi1out(1:1))
allocate(phi2out(1:1))
allocate(phi1outs1(1:1))
allocate(phi2outs1(1:1))

     dummy allocation
   allocate(phi1outind(1:1))
   allocate(phi2outind(1:1))
   allocate(phi1outinds1(1:1))
   allocate(phi2outinds1(1:1))

   do e = 1, 6
     print *,"e", e
     do f = 1, 3

       print *,"f", f, iteratst1(f), trim(filenumcharimp)

       deallocate(phi1outinds1, STAT = AllocateStatus)
     if (AllocateStatus /= 0) stop "Error during  deallocation of phi1outinds1"
     print *, "Allocatestatus of phi1outinds1 is",  AllocateStatus
     deallocate(phi2outinds1, STAT = AllocateStatus)
    print *, "DeAllocatestatus of phi1outinds2 is", AllocateStatus

     if (AllocateStatus /= 0) stop "Error during deallocation of phi2outinds1"
    print *, "we deallocate f loop ok", iteratst1(f)

      allocate(phi1outinds1(1:iteratst1(f)), STAT = AllocateStatus)
     if (AllocateStatus /= 0) stop "Error during allocation of phi1outinds1"
     allocate(phi2outinds1(1:iteratst1(f)), STAT = AllocateStatus)
    if (AllocateStatus /= 0) stop "Error during deallocation of phi1outinds1"

 end do
 end do

コンパイラ オプション

ifort -free -check  -traceback -o adatptmultistage1new.out adatptmultistage1new.f90

出力

       e           1
       f           1        5000 43
     DeAllocatestatus of phi1outinds1 is           0
    DeAllocatestatus of phi1outinds2 is           0
    we deallocate f loop ok        5000
   f loop done           1
  f           2       10000 43
 Allocatestatus of phi1outinds1 is           0
 DeAllocatestatus of phi1outinds2 is           0
 we deallocate f loop ok       10000
   f loop done           2
   f           3       15000 43
  Allocatestatus of phi1outinds1 is           0

エラーメッセージ

*** glibc detected *** ./adatptmultistage1new.out: munmap_chunk(): invalid pointer:   0x0000000000d3ddd0 ***
    ======= Backtrace: =========
    /lib/libc.so.6(+0x77806)[0x7f5863b7b806]
   .    /adatptmultistage1new.out[0x43247c]
   .    /adatptmultistage1new.out[0x404368] 
   ./adatptmultistage1new.out[0x4031ec]
   /lib/libc.so.6(__libc_start_main+0xfd)[0x7f5863b22c4d]
  .    /adatptmultistage1new.out[0x4030e9]
   ======= Memory map: ========
00400000-004d4000 r-xp 00000000 08:03    9642201 
/home/jgold/smwcv/error_infect/test/surfaces/multistage/adaptonly/adatptmultistage1new.out
006d4000-006dc000 rw-p 000d4000 08:03 9642201

[簡潔にするために、残りのエラー メッセージは表示されません]

  7fffb004d000-7fffb00bc000 rw-p 00000000 00:00 0                          [stack]
  7fffb01d7000-7fffb01d8000 r-xp 00000000 00:00 0                          [vdso]
  ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]
  Aborted
4

1 に答える 1

5

これは、私たちが理解しようとする多くのコードです。可能な限り多くのコンパイラ デバッグ オプションを使用してコンパイルしましたか? 特に、配列境界チェックを使用していますか? どのコンパイラを使用していますか? 「use」ステートメントが表示されません...サブルーチンをモジュールに入れ、そのモジュールを「使用」して、コンパイラーが実引数と仮引数の間の引数の一貫性をチェックできるようにすることをお勧めします。

編集:「二重解放または破損」は、メモリが破損していることを示しています。ポインターがないように見えるため、メモリを破損する可能性のある方法が 3 つあります。

  1. 割り当てられていない割り当て可能な変数を使用します。割り当てステートメントが失敗した場合、プログラムはおそらくその時点でエラーをスローします。割り当てるのを忘れた変数を使用している可能性があります。
  2. プロシージャーの呼び出しの引数と、プロシージャーが期待するものとの間、つまり、実引数と仮引数の間で不一致があること。モジュールを使用すると、コンパイラはこれをより適切にチェックできます。
  3. 不正な添字値を使用して配列のサイズを超える書き込みを行うと、次の配列を記述する内部構造体などの「ランダムな」メモリが上書きされます。実行時の添字または配列バインド チェックをオンにすると、これがテストされます。ifort の場合:-check boundsまたは-check all. 非常に徹底的にチェックするには、次を試してください:-O2 -stand f03 -check all -traceback -warn all -fstack-protector -assume protect_parens -implicitnone
于 2012-04-04T22:17:14.883 に答える