是否有任何方法可以直接或间接在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下发行。
谢谢
这行:
[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。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句