2012-04-04 1552 views
-5

我在解除分配和分配部分FORTRAN代碼的方面時遇到問題。特別是,我認爲這個問題與搜索網絡上的錯誤消息時的內存分配有關。該錯誤消息談到無效指針,但是,我沒有在我的程序中使用任何指針FORTRAN中的釋放和內存分配問題

完成我的f循環的迭代#2(見下文)後,程序崩潰,或者大部分時間崩潰,有時它只是凍結了。我相信這是錯誤所在。隨着程序運行到這一點。

我有子程序沒有顯示,但由於他們工作其他模擬組合,我有理由相信,他們不是問題。我正在使用釋放並在程序中的其他地方分配(成功),所以我很驚訝它不在這裏工作。

我只顯示部分程序以方便閱讀。特別是我刪除了我寫給我編寫的子程序的電話。我希望我已經爲程序員提供了足夠的信息來幫助我找出問題所在。如果不是,請說明你想要的其他信息,我會很樂意遵守。我使用各種編譯器選項編譯了該程序,並修復了一些錯誤並刪除了任何警告。但是,在這一點上,編譯器選項不會給我更多的信息。

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 
+0

你可以修復你的源代碼格式。縮進也有幫助。 – Chris 2012-04-04 21:25:35

+3

http://sscce.org/ – eriktous 2012-04-04 23:49:48

+1

您不檢查任何分配或釋放語句返回的狀態代碼。這樣做可能會提供一些有用的診斷信息。 – 2012-04-05 05:03:11

回答

5

這是我們試圖弄清楚的很多代碼。你有編譯儘可能多的編譯器調試選項儘可能?特別是,你使用數組邊界檢查?你使用什麼編譯器?我沒有看到「use」語句......最好將你的子程序放到一個模塊中並「使用」該模塊,以便編譯器可以檢查實際參數和僞參數之間的參數一致性。

編輯:「雙免費或腐敗」表明內存已損壞。既然你似乎沒有任何指針有三種可能的方式來破壞內存:

  1. 使用尚未分配的可分配變量。如果分配語句失敗,那麼程序可能會在此時發生錯誤。您可能正在使用您忘記分配的變量。
  2. 在調用過程的參數與過程期望的參數之間存在分歧,即實際參數與虛擬參數之間存在分歧。使用模塊將允許編譯器對此進行更好的檢查。
  3. 通過使用非法的下標值寫入數組的大小 - 這將覆蓋「隨機」內存,例如描述下一個數組的內部結構。打開運行時下標或數組綁定檢查將對此進行測試。使用ifort:-check bounds-check all。對於非常通過檢查嘗試:-O2 -stand f03 -check all -traceback -warn all -fstack-protector -assume protect_parens -implicitnone
+1

嗨,我會嘗試你的建議。我對代碼量表示歉意。我正在使用代碼,然後修改它以增加更多複雜性。我正在使用ifort。你的意思是數組邊界檢查 – 2012-04-05 16:00:32

+0

沒問題,所以我已經完成了這個工作,並通過告知我程序中不再使用的變量來幫助我。我無法從它提供的信息中看到任何明顯的東西。我發佈了應用這些選項的消息,以便您可以看到它,並希望能夠比我更好地解讀它。我非常感謝你的幫助。謝謝 – 2012-04-05 21:19:07

+0

看起來你現在有一個鏈接問題。有沒有更早的錯誤或警告信息? – 2012-04-06 00:05:57