将 valgrind 与“R CMD 检查”一起使用

ms6*_*609 4 unit-testing valgrind r package

我想在我的包的测试、示例和小插图上运行 valgrind。各种消息来源暗示这样做的方法应该是:

R CMD build my-pkg
R CMD check --use-valgrind my-pkg_0.0.tar.gz
Run Code Online (Sandbox Code Playgroud)

R CMD check似乎运行良好,但没有显示 valgrind 输出的证据,即使在设置环境变量之后也是如此VALGRIND_OPTS: --memcheck:leak-check=full。我发现消息来源暗示 R 需要交互运行 valgrind 才能显示输出,但R -d CMD check(或R -d "CMD check") 似乎是错误的格式。

R -d "valgrind --tool=memcheck --leak-check=full" --vanilla < my-pkg.Rcheck/my-pkg-Ex.R确实有效,但仅限于示例文件;我看不到一种简单的方法来针对我的小插图运行它并进行测试。

通过 valgrind 运行所有相关脚本的最佳方法是什么?无论如何,我们的目标是将其集成到 GitHub 操作脚本中。

Dir*_*tel 5

2022 年 3 月编辑: 情况R CMD check实际上更简单,运行R CMD check --use-valgrind [other options you may want]将运行下面的测试和示例valgrind,然后在示例输出()和测试输出(我使用的)末尾附加标准 valgrind 摘要。现在让我困惑的是,检测到的错误似乎并没有使测试失败。 pkg.Rcheck/pkg-Ex.Rout pkg.Rcheck/tinytest.Routtinytestvalgrind

分隔符下方的原始答案。


对此还有更多内容:您帮助确保 R 构建为此进行了检测。请参阅编写 R 扩展的第 4.3.2 节

在安装了 valgrind 的平台上,您可以构建带有额外工具的 R 版本,以帮助 valgrind 检测从 R 堆分配的内存使用中的错误。配置选项为 --with-valgrind-instrumentation=level,其中级别为 0、1 或 2。级别 0 是默认值,不添加任何内容。级别 1 将检测未初始化内存的某些使用117,并且对速度影响很小(与级别 0 相比)。2 级将检测许多其他内存使用错误118,但会使 R 在 valgrind 下运行时速度慢得多。将其与 gctorture 结合使用可能会更有效(甚至更慢)。

因此,您可能想为自己构建一个 Docker 化的 R 版本,以便从 GitHub Action 进行调用。我认为 Winston 的优秀“相扑”容器也有 valgrind 构建,所以你也可以尝试一下。它非常大,超过 4GB:

edd@rob:~$ docker images| grep wch     # some whitespace edit out
wch1/r-debug       latest     a88fabe8ec81      8 days ago     4.49GB
edd@rob:~$ 
Run Code Online (Sandbox Code Playgroud)

当然,如果您测试依赖包,您也必须将它们放入 valgrind 会话......