鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

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,但是仍然会出现执行成功的情况。然而即使访问野指针失败,数据内存也不可控。