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

标签 r linux docker fortran gfortran

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

您应该能够使用 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')"

问题是gfortran(6.3.0)的Docker版本和RTools中的版本不匹配导致的吗?参见 http://www.thecoatlessprofessor.com/programming/rcpp-rcpparmadillo-and-os-x-mavericks-lgfortran-and-lquadmath-error/#the-solution

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

最佳答案

我按照 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)

关于r - R 包调用的 Fortran 代码仅在 Linux 上导致段错误崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45270145/

相关文章:

javascript - 通过在 Shiny App 服务器部分创建的 jQuery UI 元素访问

linux - 运行 java bash 脚本时出现核心转储问题

linux - 如何在 Linux 中将 .c 文件转换为 .so 文件?我有 .c 文件。并需要 Linux 命令将其转换为 .so 文件

docker:无法连接到 unix:///var/run/docker.sock 上的 Docker 守护进程。 docker 守护进程是否正在运行? Windows 10 上的 Linux Bash Shell

docker - Docker撰写比特币服务

mysql - 使用 dockerfile/mysql mysqld_safe mysqld 来自pid文件错误

r - 如何比较两个表的值?

r - 在ggplot2中一起使用构面标签和 strip 标签

r - 基于两个变量的dplyr过滤

linux - 从 shell 脚本中的另一个变量创建一个变量