我有一个自己编译的 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 列中) ,所以我不明白为什么我不能运行超过三个实例。