R 包调用的 Fortran 代码仅在 Linux 上导致段错误崩溃



我正在尝试使用 smwrQW R 包。我可以让它在Windows机器上工作(example("censReg", "smwrQW")(。但是,在 Linux 机器上运行相同的代码会导致我立即出现段错误。我相信我已经将错误跟踪到以下行。

您应该能够使用 Docker 和以下一组命令重现此行为:

docker pull rocker/tidyverse
docker run -it rocker/tidyverse /bin/bash
sudo apt-get install ed
Rscript -e "devtools::install_github('USGS-R/smwrBase')"
Rscript -e "devtools::install_github('USGS-R/smwrGraphs')"
Rscript -e "devtools::install_github('USGS-R/smwrStats')"
Rscript -e "devtools::install_github('USGS-R/smwrQW')"
Rscript -e "example('censReg', package = 'smwrQW')"

问题是由 docker 版本的 gfortran (6.3.0( 和 RTool 中的版本不匹配引起的吗?请参阅 http://www.thecoatlessprofessor.com/programming/rcpp-rcpparmadillo-and-os-x-mavericks-lgfortran-and-lquadmath-error/#the-solution

我遇到了两个令人费解的怪癖。首先,如果我在上面链接的行之前设置断点(browser()((并手动逐步执行(,则没有错误。其次,特拉维斯的构建似乎正在通过。

我按照 http://r-pkgs.had.co.nz/src.html#src-debugging 中的说明运行了 gdb:

Program received signal SIGSEGV, Segmentation fault.
nortest (censflag=..., df=0, llr=0, nobsc=24, sresid=..., plev=0, 
ierr=<error reading variable: Cannot access memory at address 0x0>)
at NORTEST.f:75
75        IERR = 0

事实证明,NORTEST子例程预期的变量之一(IERR(没有被传递。修复了分配,不再有错误!谢谢德克!

更新

我不知道为什么旧代码在Windows上运行:

CALL NORTEST(CENSFLAG,DF,LLRAML,NOBSC,SRESID,PLEVAML)

NORTEST需要附加参数时:

SUBROUTINE NORTEST(CENSFLAG,DF,LLR,NOBSC,SRESID,PLEV,IERR)

最新更新