我有一个使用valgrind执行单元测试的脚本。现在脚本变大了,因为我有10个抑制文件(每个库一个),我可能需要添加更多的抑制文件。
现在不是像这样的一行:
MEMCHECK_OPTIONS="--tool=memcheck -q -v --num-callers=24 --leak-check=full --show-below-main=no --undef-value-errors=yes --leak-resolution=high --show-reachable=yes --error-limit=no --xml=yes --suppressions=$SUPPRESSION_FILES_DIR/suppression_stdlib.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_cg.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_glut.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_xlib.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_glibc.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_glib.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_qt.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_sdl.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_magick.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_sqlite.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_ld.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_selinux.supp --suppressions=$SUPPRESSION_FILES_DIR/suppression_opengl.supp"
我试过这样做:
MEMCHECK_OPTIONS="--tool=memcheck -q -v --num-callers=24 --leak-check=full --show-below-main=no --undef-value-errors=yes --leak-resolution=high --show-reachable=yes --error-limit=no --xml=yes --suppressions=$SUPPRESSION_FILES_DIR/*.supp"
但是valgrind需要一个文件名(不接受星号)。
由于我是在bash脚本中执行此操作,有人可以告诉我形成该行的最简单方法是什么?
我考虑列出抑制目录中的所有文件,然后迭代该列表,并添加--suppressions=
前缀。
修改
我忘了问。这就是我到目前为止所做的:ALL_SUPPRESION_FILES=`ls $SUPPRESSION_FILES_DIR/*.supp`
但我找不到如何将其转移到数组中。有人可以帮忙吗?
答案 0 :(得分:4)
这样做:
# form the list of suppression files to pass to the valgrind
VALGRIND_SUPPRESSION_FILES_LIST=""
for SUPPRESSION_FILE in $SUPPRESSION_FILES_DIR/*.supp; do
VALGRIND_SUPPRESSION_FILES_LIST+=" --suppressions=$SUPPRESSION_FILE"
done
不需要ls
。
这是一种没有循环的方法:
array=($SUPPRESSION_FILES_DIR/*.supp)
VALGRIND_SUPPRESSION_FILES_LIST=${array[@]/#/--suppressions=}
如果文件名包含空格,这些都不能正常工作,但是其他步骤可以解决这个问题。
答案 1 :(得分:1)
对于那些仍然面临此问题的人-看看Valgrind Suppression File Howto。
当valgrind运行其默认工具Memcheck时,它将自动尝试读取名为$ PREFIX / lib / valgrind / default.supp的文件($ PREFIX通常为/ usr)。但是,您可以通过在命令行调用中添加--suppressions =来使其使用其他抑制文件。您最多可以重复100次,对于大多数情况来说应该足够了;)
而不是每次都要键入它,将它写入rc文件更为明智。。每次运行时,valgrind都会在〜/ .valgrindrc和./文件中查找选项。瓦尔格里德rc。 [...]
创建文件(如果尚不存在)。所以我现在有一个〜/ .valgrindrc包含:
--memcheck:leak-check=full
--show-reachable=yes
--suppressions=/file/path/file1.supp
--suppressions=/file/path/file2.suppth/file2.supp
要检查valgrind是否实际上在使用抑制文件,请使用-v选项运行它。读取的抑制文件列表靠近输出的开头。
答案 2 :(得分:0)
好吧,我设法以这种方式解决了这个问题:
# form the list of suppression files to pass to the valgrind
ALL_SUPPRESION_FILES=`ls $SUPPRESSION_FILES_DIR/*.supp`
VALGRIND_SUPPRESSION_FILES_LIST=""
for SUPPRESSION_FILE in ${ALL_SUPPRESION_FILES[@]}; do
VALGRIND_SUPPRESSION_FILES_LIST="$VALGRIND_SUPPRESSION_FILES_LIST --suppressions=$SUPPRESSION_FILE"
done
我使用tokenizing strings和concanating strings来形成列表。