Fortran 95 中的"Bus Error"和"munmap_chunk(): Invalid Pointer"



我正在研究一个python项目,出于效率原因,该项目通过f2py调用fortran子例程。

当我执行代码时,它在看似随机(不一致(的点失败,并出现分段错误。使用faulthandlerPython 库,我将搜索范围缩小到Bus Errormunmap_chunk(): Invalid Pointer错误,尽管错误仍然不一致。

鉴于错误的看似随机性,恐怕我无法提供MWE。我的Fortran代码是(删节 - 完整版本在这里(:

module event_rates
contains
subroutine event_rate_f95(events, edges, events_edges, lifetimes, lt_size, NBins)
implicit none
! define input parameters
! define internal variables
dtd = delay_time_distribution(lifetimes, edges, NBins)
print *, "DTD generated"
do i = 1, NBins+1
t1 = events_edges(i-1)
t2 = events_edges(i)
print *, "Ts done"
z1 = estimate_redshift(t1)
z2 = estimate_redshift(t2)
print *, 'computing sfr'
SFR = compute_SFR(z1, z2) / (1E-3) ** 3
print *, "about to enter inner loop"
do j = 0, i-1
! do a computation
enddo
print *, "exited inner loop"
print *, i
enddo
end subroutine
end module event_rates

其中delay_time_distribution, estimate_redshift, compute_SFR是我之前定义的函数。作为参考,每当我调用它时,NBins大约是 50。在最近的3次处决中,它未能在以下方面失败:

1(i=20estimate_redshift()内,

2( 在delay_time_distribution()函数中,

3(在Fortran代码终止并将控制权交还给Python之后。

从读取有关这些错误的背景信息来看,这似乎是一个内存管理问题,因为分段错误正在访问我无法访问的内存,总线错误正在访问不存在的内存,并且munmap_chunk()将错误的指针传递给 FREE 指令。但我依靠Fortran 95的内置内存管理来为我处理这个问题。在执行代码时监视htop显示,一个内核上的 CPU 使用率达到峰值,但内存使用率保持不变。

我的问题是双重的:是什么导致了这些错误,以及如何进一步调试?

调试问题

有一种简单的方法来调试它:使用调试标志

您可能知道,如果您使用 gfortran 编译 FORTRAN,则可以将-fcheck=bounds传递给gfortran命令。同样,您可以将--opt='-fcheck=bounds'传递给f2py3命令以调试问题。

此特定问题

我试图错误地访问数组。考虑 pastebin 的第 122 行:

bin_low = floor(NBins * (x1 - NBins) / (NBins))

如果x1 = 0,则bin_low = -NBins。由于NBins(您拥有的箱数(为正数,因此变为负数。你不能索引到FORTRAN中具有负索引的数组 - 这是访问无效内存,也就是seg错误。

这里的解决方案是约束索引:

bin_low = max(1, floor(NBins * (x1 - NBins) / (NBins)))

这样,如果公式为您提供负箱,您将改为访问第一个箱。(请记住,FORTRAN 是 1 索引(

最新更新