在 Travis 上为 R 包指定 valgrind 选项 CI
Specify valgrind options to R package on Travis CI
我正在尝试在 Travis CI 上用 C++ 代码构建一个 R 包,并通过 运行 R CMD check
和 --use-valgrind
选项用 valgrind 检查它。在 R extensions manual 中,它说要么提供一个 ~/.valgrindrc
文件和所需的选项,要么在环境变量 VALGRIND_OPTS
中设置它们,但我无法弄清楚其中任何一个。
我创建了一个演示存储库 here,其中包含一个 valgrind 应该响应的 Rcpp 函数。
我的 .travis.yml
设置如下所示:
language: r
sudo: false
cache: packages
r_check_args: '--use-valgrind'
addons:
apt:
packages:
- valgrind
我有一个 .valgrindrc
文件,其中包含以下内容,
--leak-check=full
--track-origins=yes
,并尝试将它放在 ./inst/
和根目录中,但 none 成功了。有人知道如何正确设置这些选项吗?
编辑:here 是 link 到最新的 travis 版本。
根据the docs,文件./.valgrindrc
(所以在当前工作目录中,只有当文件~/.valgrindrc
不存在,并且环境变量$VALGRIND_OPTS
未设置。
不确定是什么情况,但您可能想要执行以下操作:
before_install:
- "head ~/.valgrindrc || echo '~/.valgrindrc does not exist'"
- echo VALGRIND_OPTS: $VALGRIND_OPTS
- cat ./valgrindrc >> ~/.valgrindrc
前两个用于诊断目的。最后一个可能会解决问题(它将您的配置附加到全局配置)。如果它不起作用,您可能会对正在发生的事情有更多的了解。
@joepd 给出的解决方案有效,但我发现了一个(可能)更精简的解决方案,只需设置环境变量即可。
env:
- VALGRIND_OPTS='--leak-check=full --track-origins=yes'
请注意,出于某些未知原因,valgrind 仍然建议我们设置 --leak-check=full
,这就是让我首先寻找其他解决方案的原因。
您还可以使用以下脚本自定义 valgrind 检查,并标记哪种输出会导致 travis 失败。只需制作某种 valgrind-script.R
来加载和测试包功能,然后将其和以下内容放入 tests
文件夹中。 (valgrind
也需要和.travis.yml
一起安装。)
vg_check <- function ()
{
vg <- system2 (command = 'R',
args = c ('-d "valgrind --tool=memcheck --leak-check=full"',
'-f valgrind-script.R'),
stdout = TRUE, stderr = TRUE)
lost <- NULL
types <- c ("definitely lost", "indirectly lost", "possibly lost")
for (ty in types)
{
lost_type <- which (grepl (ty, vg))
n <- regmatches(vg [lost_type], gregexpr("[[:digit:]]+", vg [lost_type]))
lost <- c (lost, as.numeric (n [[1]] [2:3]))
}
if (any (lost > 0))
stop ("valgrind memory leaks detected!")
if (attr (vg, "status") != 0)
stop ("valgrind error")
}
if (identical (Sys.getenv ("TRAVIS"), "true"))
{
vg_check ()
}
这使用 memcheck
,但您可以自定义它以使用您喜欢的 valgrind 工具,并将任何类型的输出转换为 travis 失败。
我正在尝试在 Travis CI 上用 C++ 代码构建一个 R 包,并通过 运行 R CMD check
和 --use-valgrind
选项用 valgrind 检查它。在 R extensions manual 中,它说要么提供一个 ~/.valgrindrc
文件和所需的选项,要么在环境变量 VALGRIND_OPTS
中设置它们,但我无法弄清楚其中任何一个。
我创建了一个演示存储库 here,其中包含一个 valgrind 应该响应的 Rcpp 函数。
我的 .travis.yml
设置如下所示:
language: r
sudo: false
cache: packages
r_check_args: '--use-valgrind'
addons:
apt:
packages:
- valgrind
我有一个 .valgrindrc
文件,其中包含以下内容,
--leak-check=full
--track-origins=yes
,并尝试将它放在 ./inst/
和根目录中,但 none 成功了。有人知道如何正确设置这些选项吗?
编辑:here 是 link 到最新的 travis 版本。
根据the docs,文件./.valgrindrc
(所以在当前工作目录中,只有当文件~/.valgrindrc
不存在,并且环境变量$VALGRIND_OPTS
未设置。
不确定是什么情况,但您可能想要执行以下操作:
before_install:
- "head ~/.valgrindrc || echo '~/.valgrindrc does not exist'"
- echo VALGRIND_OPTS: $VALGRIND_OPTS
- cat ./valgrindrc >> ~/.valgrindrc
前两个用于诊断目的。最后一个可能会解决问题(它将您的配置附加到全局配置)。如果它不起作用,您可能会对正在发生的事情有更多的了解。
@joepd 给出的解决方案有效,但我发现了一个(可能)更精简的解决方案,只需设置环境变量即可。
env:
- VALGRIND_OPTS='--leak-check=full --track-origins=yes'
请注意,出于某些未知原因,valgrind 仍然建议我们设置 --leak-check=full
,这就是让我首先寻找其他解决方案的原因。
您还可以使用以下脚本自定义 valgrind 检查,并标记哪种输出会导致 travis 失败。只需制作某种 valgrind-script.R
来加载和测试包功能,然后将其和以下内容放入 tests
文件夹中。 (valgrind
也需要和.travis.yml
一起安装。)
vg_check <- function ()
{
vg <- system2 (command = 'R',
args = c ('-d "valgrind --tool=memcheck --leak-check=full"',
'-f valgrind-script.R'),
stdout = TRUE, stderr = TRUE)
lost <- NULL
types <- c ("definitely lost", "indirectly lost", "possibly lost")
for (ty in types)
{
lost_type <- which (grepl (ty, vg))
n <- regmatches(vg [lost_type], gregexpr("[[:digit:]]+", vg [lost_type]))
lost <- c (lost, as.numeric (n [[1]] [2:3]))
}
if (any (lost > 0))
stop ("valgrind memory leaks detected!")
if (attr (vg, "status") != 0)
stop ("valgrind error")
}
if (identical (Sys.getenv ("TRAVIS"), "true"))
{
vg_check ()
}
这使用 memcheck
,但您可以自定义它以使用您喜欢的 valgrind 工具,并将任何类型的输出转换为 travis 失败。