valgrind: открытие нескольких файлов подавления одновременно - PullRequest
2 голосов
/ 01 декабря 2010

У меня есть скрипт, который выполняет мои модульные тесты с использованием 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`

, но я не могу найти, как передать это в массив.Может кто-нибудь помочь?

Ответы [ 3 ]

4 голосов
/ 02 декабря 2010

Просто сделайте это так:

# 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 голос
/ 26 мая 2019

Для тех, кто все еще сталкивается с этой проблемой - посмотрите Файл подавления Valgrind Howto .

Когда valgrind запускает инструмент по умолчанию, Memcheck, он автоматически пытается прочитатьфайл с именем $ PREFIX / lib / valgrind / default.supp ($ PREFIX обычно будет / usr).Однако вы можете использовать дополнительные файлы подавления по вашему выбору, добавив --suppressions = к вашему вызову командной строки.Вы можете повторить это до 100 раз, что будет достаточно для большинства ситуаций;)

Вместо того, чтобы вводить это каждый раз, более разумно записать его в файл rc. Каждый раз, когда он запускается, valgrind ищет параметры в файлах ~ / .valgrindrc и ./.valgrindrc.[...]

Создайте файлы, если они еще не существуют.Теперь у меня есть ~ / .valgrindrc, содержащий:

--memcheck:leak-check=full
--show-reachable=yes
--suppressions=/file/path/file1.supp
--suppressions=/file/path/file2.suppth/file2.supp

Чтобы проверить, что valgrind действительно использует файлы подавления, запустите его с параметром -v.Список прочитанных файлов подавления находится в начале вывода.

0 голосов
/ 01 декабря 2010

Ну, мне удалось решить проблему следующим образом:

# 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

Для формирования списка я использовал токенизирующие строки и объединяющие строки

...