2017-03-02 60 views
1

如何让totalview提供访问我的代码中的所有变量?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 
+1

除了'-g'你指定了什么编译器标志?我没有使用totalview,但常见问题[here](https://computing.llnl.gov/tutorials/totalview/#Compiling)表示不使用优化标志。默认情况下,我认为'ifort'将使用'-O2',所以你可能想要明确地声明'-O0'或类似的。 (实际上'-g'可能暗示'-O0',但它可以被覆盖) –

+0

哇,@ d_1999,你钉了它。我曾经看过这个FAQ,并删除了一个明确的'-O2'标志(并设置了'-g')进行调试,但我没有想到使用明确的'-O0'。我用'-O0 -g'重新编译,我的所有变量现在都可用。非常感谢!如果您将评论添加为答案,我会很乐意接受。 –

回答

2

当变量在像gdb和totalview这样的检查工具中不可用时,通常是因为编译器已经优化了它们。这是在TotalView的faq

暗示,而你 调试它,不要与优化标志编译程序。编译器优化可以“重写”您的程序,并生成不一定匹配您的源代码的机器代码。

由于不同的编译器有不同的默认优化级别(和潜在-g可能不仅仅包括符号之外的附加影响)它通常是一个好主意,包括明确-O0或同等为了禁止任何优化。某些编译器(例如,gfortran版本> = v4.8)提供了一个特定的调试优化级别,-Og标志如answer中所述。这允许不影响调试能力的优化。