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的地址而不是内容)。
本文来自博客园,作者:Philbert,转载请注明原文链接:https://www.cnblogs.com/liangxuran/p/14620604.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现