Fortran Coder

标题: common变量添加监视问题 [打印本页]

作者: sharpcoder    时间: 2015-4-9 14:04
标题: common变量添加监视问题
RT,求助怎样在Intel Visual Fortran (11.0)版本中如何监视common中定义的变量?
另外,在Compad Visual Fortran(6.6)中如何监视common中定义的变量?

备注:我自己试过“common名+::或%%+变量名”,都不对,显示未定义变量。

作者: fcode    时间: 2015-4-9 17:20
你理解得就不对。
common 只是变量具有的属性。而不是变量的一个集合。

具有 common 属性的变量,在调试器里,与普通变量没有区别。
作者: sharpcoder    时间: 2015-4-10 00:33
fcode 发表于 2015-4-9 17:20
你理解得就不对。
common 只是变量具有的属性。而不是变量的一个集合。

额,应该是太着急没有表述清楚哈!

我是想在整个程序的执行过程中监视一些具有common属性的变量,很明显当执行到使用某个common块的子程序时,可以方便的添加这些变量的监视。但是当当前debug的子程序不包含该common块时,就无法监视对应的变量。
问题的初衷是想查找几个计算有错误的变量,想通过对其变化的监视自顶而下地寻找到具体是在哪个子程序执行过程中发生了变化。由于需要监视的common块中的变量被使用的子程序很多很多,逐个查找不太现实,打算从程序大的调用关系入手,逐步缩小范围。
作者: fcode    时间: 2015-4-10 19:38
翻看了Intel Fortran 的手册,只有 module 变量的查看规则。没有 common 变量的查看规则。

根据我个人的理解,common 只是变量的一个属性,而不是全局变量,应该是无法查看的。

其实查找错误的方法有很多。这个问题可以通过“数据断点”来实现。

如下代码:
[Fortran] 纯文本查看 复制代码
common /x/ a , b , c
  real a , b , c
  a = 3.0
  b = 4.0
  c = 5.0
  call sb()
  call s()
  
  read(*,*)
end


subroutine s()
  common /x/ a , b , c
  a = a+1 !// 此处修改了 a
  write(*,*) a
end

subroutine sb()
  real :: a
  a = 4444.0
  write(*,*) a
end


首先在 b=4.0 出下断点,并运行至该处。
此时,我们希望查找后面对变量 a 进行了改变的代码行。

第一步,找出 a 的内存地址。
点击调试菜单,窗口,即时。

在即时窗口输入 loc(a) ,得到其内存地址:#00118AA0

有可能不是十六进制的。你可以自己转成十六进制,也可以在局部变量窗口右键,选择“十六进制显示”进行切换。

第二步,插入数据断点
点击调试菜单,断点,新建数据断点。

然后直接点击调试的“继续”

第三步,程序会自动在修改了变量 a 的内存值时停下来。





欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2