Fortran进程异常结束

定位思路

程序正常运行,但输出结果与预期存在偏差。定位思路如图1所示。

图1 Fortran进程异常结束定位思路
  1. 确认问题现象是Fortran进程异常结束。
  2. 修改编译脚本或者打开调试宏开关,重新编译可调试版程序。
  3. 打开coredump开关,再次发生异常结束时生成coredump文件。
  4. 运行程序,当程序异常结束时,在指定路径确认生成coredump文件。
  5. 使用GDB调试coredump文件,定位异常结束原因。
  6. 修改相关代码,重新编译进行验证。
  7. 问题解决,则确认修改,合入原代码。
  8. 问题未解决,重新运行程序生成coredump文件进行定位。

    如果缺乏定位信息,可在代码中增加定位信息,重新编译运行。

案例:野指针导致异常结束

问题现象:

某Fortran程序运行时出现异常结束。

定位过程:

  1. 使用top命令查看,确认程序已退出。
  2. 编译可调试版本和coredump开关,重新运行。
  3. gdb调试coredump文件,定位到问题代码点,如下图所示。

  4. Coredump位置操作了grb2_inq访问的一段内存地址qtt,正常流程grb2_inq会根据参数读取grb2文件内存,如果成功,则返回读取的内存地址qtt。目前来看,可能原因是grb2_inq读取失败,导致qtt为野指针。
  5. gdb调试打印qtt的内存地址出现问题时,qtt一直为not allocated,正常情况下,应该操作qtt,会每次coredump,但是仍然会出现执行成功的情况。然而即使访问野指针失败,数据内存也不可控。