【问题标题】:Having Trouble Debugging Possible Rcpp Memory Leak无法调试可能的 Rcpp 内存泄漏
【发布时间】:2019-08-06 01:30:40
【问题描述】:

我正在使用名为RcppCoDA的 RcppEigen 编写一个 R 包

我认为我的项目中某处可能存在内存泄漏,但我不确定。不幸的是,我在运行 Valgrind 时遇到了麻烦,因为它似乎不支持 OS X Mojave,而且我遇到了详细的错误 here

我认为重现错误应该很容易:

library(RcppCoDA) # devtools::install_github("jsilve24/RcppCoDA")
library(microbenchmark)

d <- c(100,1000)
X <- matrix(abs(rnorm(prod(d))), d[1], d[2])
X <- clo(X)

# This runs fine
z <- RcppCoDA::alr(X, d=4)

# This for some reason takes forever to run... I think this might be a bug
for (i in 1:1000){
  z <- RcppCoDA::alr(X, d=4)  
}


# This causes RStudio to crash... or takes forever to run...
microbenchmark(
  RcppCoDA::alr(X, d=4), times=10
)

我一遍又一遍地重读代码,不知道我怎么会出现内存错误,除非我只是以某种方式滥用 Rcpp...不幸的是,因为我似乎无法让 Valgrind 工作as outlined here我我真的不知道如何调试。我什至不确定我的代码或其他地方是否存在错误。

任何帮助将不胜感激!

【问题讨论】:

  • 在 macOS 上安装 Docker。在容器中调试。或者以另一种方式获得 Linux shell。 Writing R Extensions 中强调这些工具是有原因的。
  • 你可以试试rhub::check_with_valgrind()。如果这对您有用,您也可以在本地使用该特定 Docker 容器。
  • 在 mac 上设置 docker 以进行 R 包开发的一些帮助:stat.ethz.ch/pipermail/r-devel/2019-August/078269.html
  • 鉴于我大部分是通过电子邮件编写的,因此我将把它变成一篇博客文章 :) 这是一个简单的案例,尽管 Roger 只需要 gfortran-9。然而这里apt-get install valgrind 并不复杂......

标签: c++ r rcpp


【解决方案1】:

感谢一些有用的 cmets,我能够让 Valgrind 在 docker 映像中工作。

只是我如何做到这一点的概述:

  1. 我使用了 docker 镜像:rocker/rstudio
  2. 启动镜像/容器:docker run rocker/rstudio
  3. 运行时:在单独的终端中:docker ps
  4. 获取运行镜像的容器ID,然后运行:docker exec -it &lt;containerID&gt; bash
  5. 安装 valgrind 和 devtools 所需的许多其他东西
  6. 使用 valgrind 调试运行 R:R -d "valgrind --leak-check=full"
  7. 运行任何导致错误的代码并评估 valgrind 输出。

感谢您的帮助!

【讨论】:

    猜你喜欢
    • 2010-12-01
    • 2011-01-03
    • 1970-01-01
    • 2021-01-10
    • 2010-11-23
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多