Fortran 程序因分段错误立即崩溃

Fortran 程序因分段错误立即崩溃

我有一个自己编译的 Fortran 程序,并且运行了可执行文件数百次(无需重新编译或任何其他操作),但现在当我运行它时,它会因分段错误而立即崩溃。该程序的其他三个实例现在正在运行。top输出以下内容:

top - 15:37:06 up 5 days,  1:06,  2 users,  load average: 3,00, 3,01, 3,06
Tasks: 290 total,   4 running, 285 sleeping,   0 stopped,   1 zombie
%Cpu(s): 24,4 us,  0,0 sy,  0,0 ni, 75,5 id,  0,1 wa,  0,0 hi,  0,0 si,  0,0 st
KiB Mem :  8058952 total,  2409096 free,  2964692 used,  2685164 buff/cache
KiB Swap:  8263676 total,  8263676 free,        0 used.  4614096 avail Mem 

PID USER   PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                      
1230 user  20   0 12,329g 675720   3080 R 100,0  8,4  14:17.45 tetramer                                                                    
1236 user  20   0 12,329g 675688   3052 R 100,0  8,4  13:58.96 tetramer                                                                    
1234 user  20   0 12,329g 675800   3168 R 100,0  8,4  14:02.23 tetramer                                                                                                                                                     

它确实使用了大量内存(至少是虚拟内存),但到目前为止,只要实际内存使用量足够低,就可以同时运行多个实例。下面是有问题的 Fortran 代码,它在到达write.

   IMPLICIT REAL*8(A-H,O-Z)
c
  PARAMETER ( np = 220 )
c
  PARAMETER ( ndim = 25000)
  PARAMETER ( ndim2 = ndim*(ndim+1)/2 )
C
  DIMENSION  array(np,6,6),array2(np)
c
  DIMENSION  vector(50), vector2(50)
  DIMENSION  v1(159,30001),v2(159,30001),v3(159,30001)
C
  COMMON /PARM/com1(99000) ,com2(0:8,0:8,99000)
 1        ,com3(0:8),com4(0:8,0:8,0:8),nmax,mmax
 1        ,com5(0:8,0:8)
C
  COMMON /SET/ AX(0:4,-4:4,50),AY(0:4,-4:4,50),AZ(0:4,-4:4,50)
 1          ,DD(0:4,-4:4,50), dd2(0:4,-4:4), nmax0(0:4,-4:4)
C
  DIMENSION  AH( ndim2 ),AF( ndim2 ),AF2(ndim2)
  DIMENSION  E( ndim ),VEC( ndim,ndim)
  DIMENSION   AH2(ndim,ndim),TEMP(ndim,ndim)
  dimension nbarray(6)
C
  CHARACTER*1   PARI
C
  write(6,*) ' ######   ##### '

我真的不知道为什么我突然出现分段错误。据我所知,我什至还没有访问程序中的任何内存(只是分配),那么如何获得分段错误呢?

另外,当将程序的输出传输到 perlskript 时,SIGPIPE由于某种原因,我得到了 a ,尽管崩溃的是 fortran 程序,而不是 perlskript。

有谁知道这里可能发生什么以及我该如何解决它?

如果相关的话,我正在运行 ubuntu 16.04。

编辑:请求的输出是:

~$ ldd ./tetramer 
    not a dynamic executable

~$ strace ./tetramer 
    execve("./tetramer", ["./tetramer"], [/* 32 vars */]) = -1 ENOMEM (Cannot allocate memory)
    --- SIGSEGV {si_signo=SIGSEGV, si_code=SI_KERNEL, si_addr=0} ---
    +++ killed by SIGSEGV +++
    Segmentation fault (core dumped)

我还做了一些测试,它总是程序的第四个实例因分段错误而崩溃。我最近重新安装了(我擦除了一些旧的ubuntu并安装了16.04),可能在16.04下我一次只能运行三个并且没有注意到。我绝对确定在重新安装之前有超过三个实例。

我认为这可能与以下事实有关:当总内存加上交换区仅为 16GB 时,程序尝试分配 12GB 内存,但根据我现在使用的参数,它实际上只需要大约 1GB(在 RES 列中) ,所以我不明白为什么我不能运行超过三个实例。

相关内容