【问题标题】:R package fails to run examples on x64 but works on i386 and DebianR 包无法在 x64 上运行示例,但适用于 i386 和 Debian
【发布时间】:2019-08-21 03:58:12
【问题描述】:

我在将包加载到 CRAN 时遇到问题。我正在使用 R Studio 构建我的包和一些用于优化的低级 C 代码。在 R Studio 中,我可以毫无问题地加载/构建/检查我的包(我使用的是 Mac btw)。但是,当我构建包并将其提交给 CRAN 时,它被以下内容拒绝:

Flavor: r-devel-windows-ix86+x86_64
Check: running examples for arch 'x64', Result: ERROR

查看为我提供的日志后,这些示例在 Debian 和 windows i386 上运行得非常好。

有没有人知道为什么我的示例在 x64 上失败但在 i386 上工作正常?

下面是00check.log中的代码:

** running examples for arch 'i386' ... OK
** running examples for arch 'x64' ... ERROR
Running examples in 'fastcmprsk-Ex.R' failed
The error most likely occurred in:
.
.
.
> ### ** Examples
> 
> library(fastcmprsk)
> 
> set.seed(10)
> ftime <- rexp(200)
> fstatus <- sample(0:2, 200, replace = TRUE)
> cov <- matrix(runif(1000), nrow = 200)
> dimnames(cov)[[2]] <- c('x1','x2','x3','x4','x5')
> fit <- fastCrr(Crisk(ftime, fstatus) ~ cov, variance = FALSE)
* DONE
Status: 1 ERROR, 1 NOTE

我被引导相信罪魁祸首是fastCrr 函数。但是,该示例对于 arch 'i386'(见上文)和 Debian 似乎运行良好。我不明白为什么 x64 会失败,是否存在我不知道的硬件问题?我正在调用的函数调用C 进行优化例程。也许某处有泄漏,但我仔细检查并确保我 Free 每个 Calloc 变量。我不确定还有其他什么方式会发生泄漏,或者为什么它只会针对一个系统而不是另一个系统。

希望这会有所帮助。

感谢所有查看此内容的人以及您的反馈。

【问题讨论】:

  • 您可以使用rhub::check_with_valgrind 来检查内存问题。
  • x64 Windos 在long 的大小方面是“奇数”,c.f. stackoverflow.com/a/384672/8416610。也许如果有一些隐含的假设?没有看到minimal reproducible example就不可能说更多。
  • @RalfStubner 给出可重现示例的最佳方法是什么? R 包是作为 .tar.gz 构建的,但我怀疑我可以将它上传到这里。任何帮助,将不胜感激。此外,check_with_valgrind 没有显示任何问题(示例运行良好)但是当我执行 R CMD check --as-cran --use-valgrind ~/GitHub/fastcmprsk_1.0.3.tar.gz 时,它在示例中失败并出现以下错误:valgrind: mmap-FIXED(0x7fff5f400000, 8388608) failed in UME (load_unixthread1) with error 22 (Invalid argument).
  • 错误是否可以用(最好)rhub::check_on_windowsdevtools::check_win_devel 重现?如果它是可重现的,您可以在仍然产生错误的同时尽可能减少代码。最后,一个简短的.R 和一个简短的.c 字段应该是产生错误所需的全部内容。否则,您可以将源代码上传到 GitHub 或 GitLab 等代码托管平台,并在此处发布链接。
  • @RalfStubner 代码本身在 GitHub 上:github.com/erickawaguchi/fastcmprsk(分支开发人员)

标签: r r-package


【解决方案1】:

使用wch1/r-debug docker 映像,我在您的代码上运行了 UBSAN 工具。来自 gcc 的人发现了一些东西:

ralf@barra:~$ docker run --rm -it wch1/r-debug
root@9131acbabe1f:/# git clone https://github.com/erickawaguchi/fastcmprsk
root@9131acbabe1f:/# cd fastcmprsk/
root@9131acbabe1f:/fastcmprsk# git checkout developer
root@9131acbabe1f:/fastcmprsk# cd -
root@9131acbabe1f:/# RDsan -e "install.packages(c('doParallel', 'dynpred', 'codetools', 'survival'))"
root@9131acbabe1f:/# RDsan CMD build fastcmprsk
root@9131acbabe1f:/# RDsan CMD check fastcmprsk_1.0.3.tar.gz 
[...]
==5515==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6180002383d0 at pc 0x7ff3b5ad8d3f bp 0x7ffebeb2bb90 sp 0x7ffebeb2bb80  
READ of size 4 at 0x6180002383d0 thread T0
    #0 0x7ff3b5ad8d3e in ccd_dense /fastcmprsk.Rcheck/00_pkg_src/fastcmprsk/src/denseFit.c:148

确实,在 https://github.com/erickawaguchi/fastcmprsk/blob/319138af6dfe5414608a89dbb168ea1e0ab1a797/src/denseFit.c#L148 您正在通过数组边界从ici 读取,因为测试i == (n - 1) 是在测试ici[i + 1] != 1 之后评估的。我将从那里开始,即使我不确定为什么这会导致 x64 Windows 上的确定性失败。

【讨论】:

  • 这似乎不是问题。我会仔细检查。 if 语句按顺序运行是有道理的(我忽略了这一点)。我想知道我自己将如何做到这一点?我将如何在我的代码/包上运行 wch1/r-debug 和 UBSAN?我对调试很陌生,尤其是在涉及 C 编码和内存泄漏等方面。
  • @rivermouth91 请参阅github.com/wch/r-debug/blob/master/debugging-r.md 了解有关该案卷图像的良好概述。
  • 还是没有运气。它仍然卡在同一个地方。我正在尝试了解如何使用 docker 映像,但这有点令人困惑。我下载了所有东西,但我不知道如何在我的代码/R 包上运行 UBSAN。我觉得我遵循了所有指示,但是当我尝试在我的 fastcmprsk_v1.0.3.tar.gz 上运行 RDsan 时,它说它找不到目录。我认为这与容器有关,但我不完全确定。很高兴知道您采取了哪些步骤,以便我有更好的主意。除非我误读/误解了你发给我的教程。
  • @rivermouth91 我现在已经包含了我用过的全套命令。顺便说一句,你应该使用Imports 而不是Depends 引用使用过的包。
猜你喜欢
  • 2018-01-12
  • 2011-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多