'Random' “程序接收到信号 SIGABRT:处理中止信号。”错误

'Random' "Program received signal SIGABRT: Process abort signal." Error

提问人:Socorro 提问时间:9/14/2022 更新时间:9/14/2022 访问量:201

问:

我有一个大型程序(许多模块、子例程)并收到错误“程序接收信号 SIGABRT:处理中止信号”。这个错误的奇怪之处在于,它可能会发生,例如,我运行看似相同的代码 19/20 次(我在第一次运行时注意到了这一点,然后如果我尝试了很多次,它确实在蓝月亮中运行一次)。19/20 次我收到 SIGABRT 错误。 我从代码中更改的内容基本上是通过模型中“自上而下”的模块和子例程向下传递一些稍大的数组。

  • 当我传递它们但在计算中根本不使用它们时,它就会运行。
  • 当我将它们传下来并以看似无害的方式使用它们时,我会得到 19/20 倍的这个错误。出于某种原因,数组中的大值我在代码中几乎只在几行中设置为零。(因此,它似乎是从其他地方获取值并错误地分配它们)

错误的随机性,即它大多不起作用,但有时代码运行良好对我来说真的很奇怪,而且我猜它与内存/新传递的数组有关。有谁知道是什么可能导致这样的事情/如何减少内存,例如,如果对不可解除分配的数组有一种“释放”,例如: 实数 (kind=dbl_kind), dimension (20,20,5) :: my_array?非常感谢!

g 90 福特兰77

评论

1赞 Ian Bush 9/14/2022
您是否在编译和运行所有运行时检查的情况下都打开了 - 对于 gfortran?它们是否都完全相同的失败运行?即相同的可执行文件,相同的输入?主机上的负载是否因运行而异 - 即其他重要进程是否在运行?-fcheck=all
0赞 Ian Bush 9/14/2022
除了 SIGABRT 之外,您还会收到任何其他错误消息吗?你能粗略地量化你使用了多少内存吗?假设 Linux 能告诉你什么?但是请先使用 -fcheck=all 进行运行top
1赞 PierU 9/14/2022
看起来像内存溢出,但如果没有看到代码,就很难发表评论。除了@IanBush的建议之外,您是否尝试过使用调试器运行程序?
0赞 cup 9/27/2022
如果您使用的是 linux,请尝试使用 electric fence 或 valgrind 运行。这可能会大致告诉您泄漏或违规行为在哪里。
0赞 cup 5/11/2023
如果您使用的是 *nix,请将 ulimit 设置为 unlimited,并确保您有一个 /var/core 目录。当它的核心转储时,使用 coredumpctl 找出它崩溃的位置。

答: 暂无答案