【发布时间】:2014-02-25 19:05:33
【问题描述】:
我已经坐在这里一段时间了,我很困惑为什么我的调试器在程序运行正常时总是在我的代码中显示错误。一个非常简单的程序包含三个部分,它只是从文件中读取信息。
我的代码被分解成下面给出的三个 Fortran 文件并通过编译
ifort -o test global.f90 read.f90 test.f90
global.f90:
module global
implicit none
integer(4), parameter :: jsz = 904
end module global
read.f90:
subroutine read(kp,q,wt,swt)
implicit none
integer(4) :: i, j
integer(4), intent(in) :: kp
real(8), intent(out) :: swt, q(kp,3), wt(kp)
swt = 0.0d0; q(:,:) = 0.0d0; wt(:) = 0.0d0
open(7,file='test.dat')
read(7,*) ! Skipping a line
do i = 1, kp
read(7,1000)(q(i,j),j=1,3), wt(i)
swt = swt + wt(i)
end do
close(7)
return
1000 format(3F10.6,1X,1F10.6)
end subroutine read
test.f90:
program test
use global
integer(4) :: i, j
real(8) :: tot, qq(jsz,3), wts(jsz)
call read(jsz,qq,wts,tot)
stop
end program test
我一直收到的错误是
Breakpoint 1, read (kp=904,
q=<error reading variable: Cannot access memory at address 0x69bb80>,
wt=..., swt=6.9531436082559572e-310) at read.f90:6
当read的子程序被调用时,就会出现这个错误。换句话说,我在read 子例程处添加一个断点,并在添加断点后在gdb 中运行代码。当我在“测试”程序中包含写入语句时,程序将继续按预期运行并给出正确的输出。但是,如果我使用 gdb 打印选项,我会收到“无法访问地址 0x69bb80 的内存”的错误,仅适用于数组 q。所有其他数组和变量都可以正常显示。
由于我希望read 子例程是一个独立的子例程并且不一定使用任何全局参数,因此我没有使用全局模块,而是将变量kp 调用到子例程中。我决定测试使用全局模块是否有帮助,如果我使用jsz 代替kp,我确实消除了错误。但是,由于这不是我对子例程的总体目标,我希望弄清楚如何在不使用全局模块的情况下解决这个问题。 (我也试过完全不使用全局,直接在test.f90程序中设置kp的参数变量,但这也会报错。)
任何有关此错误可能原因的见解,或尝试修复内存寻址问题的建议将不胜感激。
【问题讨论】:
-
你用的是什么编译器,我刚刚在Mac OSX的INTEL编译器上编译了代码没有问题?如果您正在使用 gfortran 编译器,我经常在重新编译最初在 INTEL 编译器上开发的代码时遇到问题。
-
从问题中可以看出他使用了
ifort。 -
正如 Vladimir 所提到的,我实际上使用的是 intel 编译器。我相信它是 Fedora 19 上的版本 13,gdb 版本是 7.6.1-42。
-
补充我的最后一条评论,我刚刚在两台不同的计算机上编译,都使用 ifort 13.0.0 20120731 和 fedora 19。但是,调试器略有不同 7.6.1-42 和 7.6 .1-46 为另一个。如果我将文件分开或将其设为一个文件,则会出现同样的错误。
标签: debugging gdb fortran memory-address