有没有办法在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发行版下。
由于
答案 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)
的错误 - 它会创建一个名为core
或core.pid
的文件,其中pid
是一个数字。最后,您可以像这样运行gdb
:
gdb ./test.exe core.pid
它将打印一大堆信息,然后向您发出(gdb)
提示。使用bt
运行堆栈跟踪,以查看程序崩溃时发生的情况。 quit
将退出gdb。