1

如何让 totalview 提供对代码中所有变量的访问权限?

我正在尝试使用 totalview 调试 Fortran90 程序。我使用“-g”标志编译并与英特尔的 ifort 链接。totalview 可以单步执行我的程序,但只为我的子程序中的四个变量提供“潜水”,并且许多可执行源代码行没有我可以检查以设置操作点的框。在下面声明的所有变量中,只有 cell_EW、cell_NS、area 和 pct 可用于稍后在子例程中进行潜水。

164  REAL, allocatable, DIMENSION(:), INTENT(in) :: lon, lat
165  REAL, ALLOCATABLE, DIMENSION(:, :, :, :) :: area, pct
166  REAL, ALLOCATABLE, DIMENSION(:, :, :), INTENT(in) :: in_flux
167  REAL, ALLOCATABLE, DIMENSION(:, :, :), INTENT(inout) :: out_flux
168  REAL :: cell_EW, cell_NS
169  INTEGER status, ierr, dimid, nlon, nlat, ntimes
170  INTEGER i, j, k, LOGDEV, this_var, this_t
171  INTEGER jdate, jtime, this_date, this_time

另一个例子:第 190 行不允许我设置动作点,并且 ntimes 未被识别为变量。

189  CALL calc_land_area(pct, cell_EW, cell_NS, lon, lat, area)
190  ntimes = SIZE(in_flux, 1)  ! first dimension is time
191  do i = 1, ntimes
4

1 回答 1

3

当变量在 gdb 和 totalview 等检查工具中不可用时,通常是因为编译器已将它们优化掉。这在 totalview常见问题解答中有所暗示

调试时不要使用优化标志编译程序。编译器优化可以“重写”您的程序并生成不一定与您的源代码匹配的机器代码。

由于不同的编译器具有不同的默认优化级别(并且-g可能除了包含符号之外还可能具有其他含义),因此包含显式-O0或等效项以禁用任何优化通常是个好主意。一些编译器(例如 gfortran 版本 >= v4.8)提供了一个特定的调试优化级别,带有这个答案-Og中提到的标志。这允许进行不影响调试能力的优化。

于 2017-03-03T08:11:20.050 回答