相关文章推荐
酒量小的领带  ·  python - Is ...·  1 年前    · 
豁达的哑铃  ·  sql - ...·  1 年前    · 
机灵的皮蛋  ·  MySQL的ibdata1详解_Demons ...·  1 年前    · 
不拘小节的口罩  ·  Java 中使用 Jersey ...·  1 年前    · 
fortran程序报错及其解决方式(program received signal sigsegv:segmentation fault-invalid memory reference),主要介绍两类内存溢出的错误。

fortran程序报错:

program received signal sigsegv:segmentation fault-invalid memory reference

0x000000000042087c

1x0.......
1x0.......

core dumped

内容解读:1x0等代号代表内存地址,即内存中存储的函数和变量。如果编译时在gfortran后加入-g选项,即可在报错的时候看到该地址对应的函数名称。

报错原因:内存溢出,函数中给变量声明的内存空间太小。

解决方式:gdb调试,watch监视全局变量的内存地址,然后在声明中给变量分配足够的内存空间。

内存溢出的另一种表现:没有报错,但是全局变量的值会发生改变!

这类错误非常隐蔽,当某个变量内存溢出时,会占用其他全局变量的内存空间,导致一些全局变量归零,但是这类错误往往没有任何报错提示,只能一步一步输出,或是在GDB中监控。

一个调试的例子

假如报错内容如下:

program received signal sigsegv:segmentation fault-invalid memory reference

0x000000000042087c

首先用GDB进入调试界面,用backtrace命令(简称bt)输出所有局部变量和他们的内存地址

(gdb)  bt

然后用examine命令(简称x)输出溢出的内存的内容

(gdb) x 0x000000000042087c

0x401142 <main+50>:     -nan(0x7e99e8)

说明是main函数里面的内存地址为“0x401142”的变量溢出了。

然后用print命令(简称p)把main函数里面的数组内存地址依次打印,看哪个数组的地址和溢出内存的地址最靠近。

(gdb) p /a var1

(gdb) p /a var2

(gdb) p /a var3

然后就可以判断出来是哪个数组的内存溢出了(p的“/a”选项代表输出变量var的地址而不是内容)。

作者:Xuran,中科院在读博士,博客网址https://www.cnblogs.com/liangxuran/转载请标明出处。