计算化学公社

 找回密码 Forget password
 注册 Register
Views: 3478|回复 Reply: 7
打印 Print 上一主题 Last thread 下一主题 Next thread

[Fortran] bus error错误求助

[复制链接 Copy URL]

257

帖子

4

威望

4967

eV
积分
5304

Level 6 (一方通行)

跳转到指定楼层 Go to specific reply
楼主
自己写了个量化程序。最近加了MP2代码,写了一个subroutine存在了另一个.f90文件里面,主程序里也只是加了一行call 这个subroutine而已。
编译没问题,但运行时报错:
Bus error (core dumped)

查看输出文件发现MP2之前的所有结果都运行正常,唯独这个subroutine没有运行(连第一行输出字符都没运行)。查了Bus error的一些信息也没得到什么结果。
有种说法是编译时把ifort改成ifort -v就行。已尝试过这个方法不起作用。所以这个应该怎么解决呢?
贫困U 退学与疯子工程学院

3806

帖子

4

威望

7994

eV
积分
11880

Level 6 (一方通行)

MOKIT开发者

2#
发表于 Post on 2020-4-16 14:14:31 | 只看该作者 Only view this author
ifort编译参数加上-traceback呢,有更多报错信息么。
自动做多参考态计算的程序MOKIT

257

帖子

4

威望

4967

eV
积分
5304

Level 6 (一方通行)

3#
 楼主 Author| 发表于 Post on 2020-4-16 14:42:14 | 只看该作者 Only view this author
zjxitcc 发表于 2020-4-16 14:14
ifort编译参数加上-traceback呢,有更多报错信息么。

谢谢你。我昨天已经发现导致这个错误的原因了,但由此发现了一个更诡异的bug。

MP2 代码没有问题。有问题的在于我在调用这个子程序前调用了另一个子程序pop_analy(做布居分析用的)。
pop_analy要求输入两个整型变量(nbas,nele,分别是基组数和电子数),本身不会修改这两个数。但调用完这个子程序后这两个数就变成了整型变量的上限(特别大),导致MP2代码里以这两个数为变量的数组内存空间溢出报错。

pop_analy这个子程序的输出没有任何问题。诡异的是这个子程序里面没有修改过nbas和nele,更诡异的是我在pop_analy这个子程序的最后一行加上让他输出这两个变量的值,而输出的又是正确的值!但一旦离开这个子程序,这两个变量的值立刻就变了!所以我完全没有头绪了,这个可能是什么原因导致的呢?
贫困U 退学与疯子工程学院

3806

帖子

4

威望

7994

eV
积分
11880

Level 6 (一方通行)

MOKIT开发者

4#
发表于 Post on 2020-4-16 15:20:55 | 只看该作者 Only view this author
本帖最后由 zjxitcc 于 2020-4-16 15:23 编辑
wxhwbh 发表于 2020-4-16 14:42
谢谢你。我昨天已经发现导致这个错误的原因了,但由此发现了一个更诡异的bug。

MP2 代码没有问题。有 ...

这种事很难讲,建议写程序的时候使用
integer, intent(in) :: 变量
还有intent(out), intent(inout)等显式地指定可否修改。
还有查看数组是否越界。ifort也可以加-CB检查。

自动做多参考态计算的程序MOKIT

257

帖子

4

威望

4967

eV
积分
5304

Level 6 (一方通行)

5#
 楼主 Author| 发表于 Post on 2020-4-17 14:54:11 | 只看该作者 Only view this author
zjxitcc 发表于 2020-4-16 15:20
这种事很难讲,建议写程序的时候使用
integer, intent(in) :: 变量
还有intent(out), intent(inout)等 ...

谢谢你,但我已经指定了这两个变量是intent(in)的,而它依旧被修改了,我就很不能理解。
贫困U 退学与疯子工程学院

3806

帖子

4

威望

7994

eV
积分
11880

Level 6 (一方通行)

MOKIT开发者

6#
发表于 Post on 2020-4-17 15:23:11 | 只看该作者 Only view this author
wxhwbh 发表于 2020-4-17 14:54
谢谢你,但我已经指定了这两个变量是intent(in)的,而它依旧被修改了,我就很不能理解。

那就是别的数组越界了,写到这里来了
自动做多参考态计算的程序MOKIT

257

帖子

4

威望

4967

eV
积分
5304

Level 6 (一方通行)

7#
 楼主 Author| 发表于 Post on 2020-4-17 15:45:41 | 只看该作者 Only view this author
zjxitcc 发表于 2020-4-17 15:23
那就是别的数组越界了,写到这里来了

别的数组越界会导致这种情况吗?我没有十分理解,可以举个例子吗?
贫困U 退学与疯子工程学院

3806

帖子

4

威望

7994

eV
积分
11880

Level 6 (一方通行)

MOKIT开发者

8#
发表于 Post on 2020-4-17 20:39:39 | 只看该作者 Only view this author
wxhwbh 发表于 2020-4-17 15:45
别的数组越界会导致这种情况吗?我没有十分理解,可以举个例子吗?

各个变量和数组都在内存里,你数组越界了,就有可能跑去修改别的变量,但修改哪个变量并不是确定的,与编译器、系统环境等各个因素都有关。例如用gfortran编译以下代码,最后i会打印出1.若你用ifort编译,则仍打印出0。当然,这只是示例,实际情况可能比这复杂。
  1. program main
  2. implicit none
  3. integer :: a(5), i, n
  4. a = 0
  5. i = 0
  6. n = 0
  7. a(n) = 1
  8. write(*,*) 'i=', i
  9. stop
  10. end
复制代码

评分 Rate

参与人数
Participants 1
eV +5 收起 理由
Reason
wxhwbh + 5 谢谢分享

查看全部评分 View all ratings

自动做多参考态计算的程序MOKIT

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2024-11-24 02:35 , Processed in 0.173449 second(s), 27 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list