我正在尝试运行一些似乎存在内存问题的遗留Fortran代码。
我不是一个强大的程序员,从来没有写过一系列的fortran。
偶尔在我的Mac上,程序SIGABRTs在一些输入上但在大多数输入上它的工作正常。但是,在我的Ubuntu机器上,它总是SIGABRT甚至可以在Mac上正常工作的文件上。
为了尝试追踪问题,我在Ubuntu机器上使用valgrind运行程序。
valgrind ./a.out
瞧,当程序在valgrind下运行时,它运行完全没有任何问题。很奇怪,对吗?
运行时收到的错误消息sans-valgrind:
Within subroutine domdecision
END OF ROUTINE
*** Error in `./a.out': free(): invalid size: 0x0000000031043e80 ***
Program received signal SIGABRT: Process abort signal.
Backtrace for this error:
#0 0x7FD269195777
#1 0x7FD269195D7E
#2 0x7FD268AE6D3F
#3 0x7FD268AE6CC9
#4 0x7FD268AEA0D7
#5 0x7FD268B23F23
#6 0x7FD268B301FD
#7 0x40C807 in domdecision_ at gnm-domdecomp.f:434
#8 0x404B2F in domdecomp_ at gnm-domdecomp.f:226
#9 0x40F9A5 in MAIN__ at gnm-domdecomp.f:47
gnm-domdecomp.f的第433-434行是:
real*8 dist,tdist
- ,wt(nmax),temp,ut(nmax,nmax)
看起来就像数组计算。
所以我的问题是,1。可能的错误是什么,2。为什么它会在某些机器上和valgrind下消失,以及3.接下来我应该怎么做才能调试这个?