我编译了一个Fortran代码,它包含几个模块,同时使用gfortran 4.4和intel 11.1,随后尝试使用gdb和DDT进行调试。在所有情况下,我都看不到在模块中声明的任何变量的值。这些全局变量具有值,因为代码仍然正常运行,但我看不到在调试器中的值。局部变量很好。我很难在其他地方找到解决方案,所以也许没有简单的解决方案,但如果我看不到任何全局变量的值,那么调试我的代码将会非常困难。Fortran模块变量无法在调试器中访问
回答
在gdb中,尝试引用带有名的全局变量,如__ MODULENAME __ VARIABLENAME
您可以检查,这是使用纳米和grep找到在你的全局变量的一个重整方案的权利您程序的符号。
如果这不起作用,请确保您使用的是最新版本的gdb。
下面是关于这个问题的线索:http://gcc.gnu.org/ml/fortran/2005-04/msg00064.html
除了使用-O0进行编译之外,它还可以显示非数组元素。我可以打印全局变量,但我仍然看不到全局数组的值。当我尝试将数组的名称打印为__modulename_MOD_arrayname时,会返回一些看似随机的大数字。如果我尝试打印数组中的一个元素,我会得到-nan(0xf ...)。任何想法如何让数组正确输出以及非数组变量? – rks171 2012-04-22 16:21:16
为了记录我的进度,我试着用intel 11.1(这次是-O0)和gdb进行调试,所有全局变量和全局数组都可以正确打印出来。我尝试用g95构建和使用gdb进行调试,即使使用-O0(我必须使用上面列出的命名约定来获取它们),全局变量也不会打印出来。但全局阵列仍然不打印出来。总之,它似乎是gfortran和g95的问题,而不是gdb。并与英特尔11.1建设工作正常。 – rks171 2012-04-22 17:03:48
对于较新的GDBS(7.2,如果我没有记错),调试模块很简单。看看下面的程序:
module modname
integer :: var1 = 1 , var2 = 2
end module modname
use modname, only: newvar => var2
newvar = 7
end
您现在可以运行:
$ gfortran -g -o mytest test.f90; gdb --quiet ./mytest
Reading symbols from /dev/shm/mytest...done.
(gdb) b 6
Breakpoint 1 at 0x4006a0: file test.f90, line 6.
(gdb) run
Starting program: /dev/shm/mytest
Breakpoint 1, MAIN__() at test.f90:6
6 newvar = 7
(gdb) p newvar
$1 = 2
(gdb) p var1
No symbol "var1" in current context.
(gdb) p modname::var1
$2 = 1
(gdb) p modname::var2
$3 = 2
(gdb) n
7 end
(gdb) p modname::var2
$4 = 7
(gdb)
它必须是gdb 7.2,因为我在我的系统上安装了7.1,并且键入“p modname :: var”仍然导致“当前上下文中没有符号”,所以它可以工作。但是,请注意,整个问题似乎是一个gfortran问题,而不是gdb问题,因为当我使用intel ifort 11.1构建源代码时,gdb在打印本地或全局变量或数组时没有问题。没有使用gfortran进行优化的构建允许打印全局变量,但仍然不是全局数组。 – rks171 2012-04-23 13:11:16
- 1. 从C++访问fortran模块的变量
- 2. 访问变量和模块的方法,在多模块程序
- 3. f2py从Fortran模块中恢复变量
- 4. Fortran:模块中的可分配变量
- 5. 无法访问模块控制器中的模块表单
- 6. 无法调用访问会话变量
- 7. 无法访问Python模块
- 8. Fortran中模块使用的模块的变量范围
- 9. 无法在jQuery中访问变量
- 10. 无法在VBscript中访问GET变量
- 11. 在synchronized块中声明无法访问的变量 - Java的
- 12. Fortran模块和全局变量
- 13. 无法访问变量
- 14. 无法访问类变量
- 15. Python:如何访问调用模块中的变量?
- 16. 从Cython访问Fortran常用变量
- 17. FORTRAN调试问题
- 18. 无法找到我的变量访问器/增变器方法
- 19. 访问Qunit模块安装变量
- 20. 如何从模块访问类变量?
- 21. 访问模块实例变量
- 22. 从node.js模块访问全局变量?
- 23. Angular2嵌套组件变量无法在模板中访问
- 24. 在调试模式下对Matlab变量的访问
- 25. 有没有办法访问模块中的根级变量?
- 26. 无法访问Xcode 4中的调试
- 27. 无法访问的变量,并使用对象文本模块模式
- 28. 在Struct.new块中访问类变量
- 29. 无法访问全局变量在python
- 30. 无法访问Laravel中的env变量
你跟标志编译-O0和-g? – 2012-04-22 01:39:38
我已经看到了这一点,我所做的是将变量放在用户类型中,并保留一个全局(保存)的记录。然后你在调试器中访问%(例如OT包含我的gobals时的OT%POINT_COUNT) – ja72 2012-04-22 01:49:51
对于Nick Atoms,用-O0编译做了诀窍,但是仅适用于非数组元素。我读过优化可能导致全局变量不可访问,但我认为如果没有使用优化标志,那么编译器默认没有进行优化。显然,我错了。但是,我仍然无法访问全局数组中的任何信息。同样,它们正在被读入并正确赋值,但是我不能在调试器中打印整个数组或单个元素。 – rks171 2012-04-22 16:17:43