复制 CRAN valgrind 问题

Replicating CRAN valgrind issues

我正在尝试修复我在 CRAN 上的包裹 CamelUp 的一些问题。这个包使用 Rcpp 来实现棋盘游戏。我最近的 CRAN 提交已经返回评论和输出,例如:

==32365== 16,591,624 (2,608,512 direct, 13,983,112 indirect) bytes in
20,379 blocks are definitely lost in loss record 3,036 of 3,036
==32365==    at 0x4838E86: operator new(unsigned long)
(/builddir/build/BUILD/valgrind-3.15.0/coregrind/m_replacemalloc/vg_replace_malloc.c:344)
==32365==    by 0x184ED3E5: Board::Board(Board const&)
(/tmp/CamelUp.Rcheck/00_pkg_src/CamelUp/src/Board.cpp:67)
...
==32365==    by 0x1853045D: Simulator::simulateDecision(bool, int)
(/tmp/CamelUp.Rcheck/00_pkg_src/CamelUp/src/Simulator.cpp:64)
==32365==    by 0x18536509: Rcpp::CppMethod2<Simulator, Rcpp::Vector<19,
Rcpp::PreserveStorage>, bool, int>::operator()(Simulator*, SEXPREC**)
(R-devel/site-library/Rcpp/include/Rcpp/module/Module_generated_CppMethod.h:195)
==32365==    by 0x18535B32:
Rcpp::class_<Simulator>::invoke_notvoid(SEXPREC*, SEXPREC*, SEXPREC**,
int) (R-devel/site-library/Rcpp/include/Rcpp/module/class.h:234)
==32365==    by 0x17B9EBE1: CppMethod__invoke_notvoid(SEXPREC*)
(/tmp/RtmpKDbrDI/R.INSTALL1d1838b282b2/Rcpp/src/module.cpp:220)

我在重现这些错误时遇到问题,我想知道是否有一种直接的方法可以在我的包中使用 valgrind 来重现这些错误。我已经尝试 运行 在本地使用 valgrind,但无法使 track origins 选项起作用,也无法弄清楚这些错误在我的代码中的位置。我还尝试将 Travis-CI 与以下 .travis.yml 文件一起使用:

language: r
cache: packages
r_check_args: '--use-valgrind'
addons:
  apt:
    packages:
      - valgrind
r:
  - oldrel
  - release
  - devel
env:
  - VALGRIND_OPTS='--tool=memcheck --memcheck:leak-check=full --track-origins=yes'

我希望有一种方法可以复制这些错误,以便我可以修复它们。

我成功地使用 Docker 到 运行 valgrind 进行测试,但我最终决定集成此测试的最佳方法是使用 Travis-CI。我的 .travis.yml 文件如下所示:

language: r
cache: packages
addons:
  apt:
    packages:
      - valgrind
r:
  - oldrel
  - release
  - devel

after_success:
  - R -e "install.packages('${PKG_TARBALL}', repos=NULL, type='source')"
  - cd tests
  - R -d "valgrind --tool=memcheck --leak-check=full --track-origins=yes"  --vanilla < testthat.R
  - cd ..

现在 运行 使用 valgrind 进行测试,尽管我必须手动滚动查看结果。在某些时候,如果存在内存泄漏,我会让构建失败,但现在这对我有用。我主要不熟悉 Docker 和 valgrind,并且没有意识到我需要在测试目录中才能 运行 testthat.R.

中的测试