解释fortran 90中的内存地址

时间:2014-06-05 19:07:47

标签: fortran90 memory-address

有没有办法在fortran(90)中直接/间接解释十六进制地址。例如,有时我会遇到内存分段问题,然后是Failing at address: 0x1fffffff8。更完整的消息是这样的:

[amir-desktop] *** Process received signal ***
[amir-desktop] Signal: Segmentation fault (11)
[amir-desktop] Signal code: Address not mapped (1)
[amir-desktop] Failing at address: 0x1fffffff8
[amir-desktop] [ 0] /lib/libpthread.so.0(+0xf8f0) [0x2af5efcb08f0]
[amir-desktop] [ 1] test.exe(__box_mod_MOD_constructlist+0x35c) [0x44052c]
[amir-desktop] [ 2] test.exe(__box_mod_MOD_box_move+0x72) [0x443372]
[amir-desktop] [ 3] test.exe() [0x44c81b]
[amir-desktop] [ 4] test.exe(main+0x1d) [0x41336d]
[amir-desktop] [ 5] /lib/libc.so.6(__libc_start_main+0xfd) [0x2af5f59a9c8d]
[amir-desktop] [ 6] test.exe() [0x41391d]

是否可以通过简单的print语句来实现此地址与特定变量相关。我知道loc函数打印一个关于变量地址的整数(如果它们可以转换为十六进制类型地址,则会出现另一个问题)。我猜想有可能为此目的使用调试器。如果有人可以对此(以及一些建议)发表评论,我将不胜感激。

我目前正在使用gfortran 4.6。在linux发行版下。

由于

1 个答案:

答案 0 :(得分:1)

这一行:

[amir-desktop] [ 1] test.exe(__box_mod_MOD_constructlist+0x35c) [0x44052c]

告诉您错误发生在constructlist模块中的函数box_mod中。我会先找那些明显的错误。

尝试使用以下标志进行编译:

gfortran -g -fbacktrace -fbounds-check -Wall test.f90

这些将(按顺序):打开调试符号,打印回溯,检查数组边界并在编译期间打印大多数有关不安全代码的警告。

如果仍然无法解决您的问题,您可以在核心转储上使用gdb。这是程序崩溃时的状态记录。您需要首先在终端中运行ulimit -c unlimited来启用核心转储。接下来,运行代码 - 您应该收到类似Segmentation fault (core dumped)的错误 - 它会创建一个名为corecore.pid的文件,其中pid是一个数字。最后,您可以像这样运行gdb

gdb ./test.exe core.pid

它将打印一大堆信息,然后向您发出(gdb)提示。使用bt运行堆栈跟踪,以查看程序崩溃时发生的情况。 quit将退出gdb。