Обложка Memcheck предоставляет помощника для анализа Valgrind Memcheck.
Он также предоставляет форматирование генератора отчетов HTML, форматирующего отчеты Valgrind Raw и выделение важных частей, которые помогут вам интерпретировать эти результаты.
Его можно легко использовать в вашей среде CI для автоматического генерации отчетов.
Демонстрация, будучи лучше, чем любые слова, вы можете найти пример сгенерированного отчета HTML здесь.
Сценарий memcheck_runner.sh - это обертка, которая будет запускать двоичный файл под инструментом Valgrind Memcheck.
Для сценария memcheck_runner.sh для работы необходимо установить и доступны следующие инструменты с использованием переменной среды пути:
bash Bash версии 4 и только верхние поддерживаются.valgrind Valgrind версия 3.13 была протестирована, более старая версия может не работать, как задумано Вот его использование (к нему можно получить доступ, используя опцию --help ):
Usage: memcheck_runner.sh [OPTIONS]... -- [BIN] [BIN_ARG]...
Runs the BIN with the BIN_ARGs through valgrind memcheck analyser.
Options:
-h|--help Displays this help message.
-i|--ignore=FILE Provides valgrind FILE as the suppression file.
-o|--output-name=NAME [MANDATORY] Defines the output file name
(will be suffixed with the .memcheck extension).
-s|--gen-suppressions Enables valgrind suppression generation in the output
file, those can be used to create a suppression file.
--fullpath-after= (with nothing after the '=')
Show full source paths in call stacks.
--fullpath-after=STR Like --fullpath-after=, but only show the part of the
path after 'STR'. Allows removal of path prefixes.
Use this flag multiple times to specify a set of
prefixes to remove.
Единственным обязательным вариантом является --output-name , которое будет определять путь и имя выходного файла.
Если путь не существует, он будет создан.
Расширение .memcheck будет автоматически добавлено к нему для совместимости с помощью скрипта generate_html_report.sh .
Пример:
$ memcheck_runner.sh --output-name " my/output/path/filename " -- true can take useless params and still be one true self
Info: Output file set to: ' my/output/path/filename.memcheck '
Info: Creating output directory ' my/output/path/ '
Info: Running the following cmd with valgrind:
" true " " can " " take " " useless " " params " " and " " still " " be " " one " " true " " self " Вы можете указать файл подавления нарушений, используя опцию --ignore .
Такой файл подавления должен следовать правилам подавления файла подавления Валгринда.
Подания могут быть сгенерированы в отчете с использованием опции --gen-suppressions .
Подавление будет выглядеть так в отчете:
[...]
==21849== 4 bytes in 1 blocks are definitely lost in loss record 1 of 1
==21849== at 0x4C3017F: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==21849== by 0x108687: breakage::evil_definitely_lost_func() (main.cpp:4)
==21849== by 0x10869B: main (main.cpp:10)
==21849==
{
<insert_a_suppression_name_here>
Memcheck:Leak
match-leak-kinds: definite
fun:_Znwm
fun:_ZN8breakage25evil_definitely_lost_funcEv
fun:main
}
==21849== LEAK SUMMARY:
==21849== definitely lost: 4 bytes in 1 blocks
[...]
Этот вызов выведет отчет Valgind в файл filename.memcheck в каталоге my/output/path/ , который был создан в этом примере.
Анализ Valgrind был запущен с использованием true двоичного файла, передавая его много параметров.
Из документации Valgrind:
By default Valgrind only shows the filenames in stack traces, but not full paths to source files.
When using Valgrind in large projects where the sources reside in multiple different directories, this can be inconvenient.
`--fullpath-after` provides a flexible solution to this problem.
When this option is present, the path to each source file is shown, with the following all-important caveat:
if string is found in the path, then the path up to and including string is omitted, else the path is shown unmodified.
Note that string is not required to be a prefix of the path.
For example, consider a file named /home/janedoe/blah/src/foo/bar/xyzzy.c. Specifying --fullpath-after=/home/janedoe/blah/src/ will cause Valgrind to show the name as foo/bar/xyzzy.c.
Because the string is not required to be a prefix, --fullpath-after=src/ will produce the same output. This is useful when the path contains arbitrary machine-generated characters.
For example, the path /my/build/dir/C32A1B47/blah/src/foo/xyzzy can be pruned to foo/xyzzy using --fullpath-after=/blah/src/.
If you simply want to see the full path, just specify an empty string: --fullpath-after=. This isn't a special case, merely a logical consequence of the above rules.
Finally, you can use --fullpath-after multiple times. Any appearance of it causes Valgrind to switch to producing full paths and applying the above filtering rule.
Each produced path is compared against all the --fullpath-after-specified strings, in the order specified. The first string to match causes the path to be truncated as described above.
If none match, the full path is shown.
This facilitates chopping off prefixes when the sources are drawn from a number of unrelated directories.
Передача --fullpath-after to memcheck_runner.sh перенесет его непосредственно в Valgrind, имея ранее описанный эффект.
На данный момент параметры Valgrind не настраиваемы.
Используются следующие параметры:
--track-origins=yes--leak-check=full--show-reachable=yes--show-leak-kinds=all--show-leak-kinds=all--show-leak-kinds=definite,indirect,possible,reachable--num-callers=50--fair-sched=yesДля получения более подробной информации, пожалуйста, обратитесь к документации Valgrind.
Сценарий generate_html_report.sh будет генерировать отчет HTML со всеми файлами результатов Memcheck в данном каталоге.
Для сценария generate_html_report.sh для работы необходимо установить и доступны следующие инструменты с использованием переменной среды пути:
bash Bash версии 4 и только верхние поддерживаются.gawk gnu awk 4.1.4 был протестирован, более старая версия может не работать, как задумано Вот его использование (к нему можно получить доступ, используя опцию --help ):
Usage: generate_html_report.sh [OPTIONS]...
Parses all .memcheck files from a given directory and generates an HTML
report.
Options:
-h|--help Displays this help message.
-g|--generate-config Generates a 'memcheck-cover.config' file in the current
directory, containing the default configuration values.
-c|--config=FILE Loads the configuration from FILE. An example
configuration file can be generated using the
--generate-config option.
If this option is not set, or values are missing in
FILE, the default values will be used.
-i|--input-dir=DIR [MANDATORY] Defines the input directory where the
.memcheck files are.
The files will be searched in directories recursivly.
-o|--output-dir=DIR [MANDATORY] Defines the output directory where the
HTML report will be produced.
У генератора есть два обязательных параметра:
--input-dir , который определяет путь, в котором отчеты Мемчека, который будет обрабатываться..memcheck который он находит.--output-dir который определяет путь, в котором будет генерируется отчет HTML. Если настройки нарушения по умолчанию вам не подходят, каждая критичность нарушения может быть скорректирована.
Файл конфигурации со всеми доступными параметрами критичности и их значениями по умолчанию может быть сгенерирован с помощью опции --generate-config :
$ generate_html_report.sh --generate-config
Info: Generating configuration with default values: ' memcheck-cover.config ' ...
Done. The generated configuration can be modified and then loaded
by the current script using the --config option.
If a violation is not set, the default value will be used. Файл конфигурации по умолчанию генерируется в текущем каталоге в файле memcheck-cover.config .
Затем вы можете изменить любую критичность, чтобы соответствовать вашим потребностям, и передать его генератору, используя опцию --config .
Если в файле отсутствует какая -либо критичность, будет применяться по умолчанию.
Пропуск любого файла конфигурации с неверными параметрами или значениями параметров приведет к ошибке.
Например:
Error: Invalid configuration value 'dummy' for parameter: memcheck_violation_criticality['contains_unaddressable'] => dummy критичности не существуетError: Invalid configuration parameter: memcheck_violation_criticality['dummy_param'] => Ключ dummy_param не существует для memcheck_violation_criticalityВот пример поколения, со следующим деревом:
my/output/path/
├── another_dir/
│ ├── a_report.memcheck
│ └── other_report.memcheck
└── filename.memcheck
Давайте запустим генератор HTML:
generate_html_report.sh --input-dir " my/output/path/ " --output-dir " my/output/path/report/ " --config memcheck-cover.config
Info: Input directory set to: ' my/output/path/ '
Info: Loading configuration from file ' memcheck-cover.config ' ...
Info: Processing memcheck file ' filename.memcheck ' ...
Info: Processing memcheck file ' another_dir/a_report.memcheck ' ...
Info: Processing memcheck file ' another_dir/other_report.memcheck ' ...
Info: Generating index.html...Результат будет выглядеть так:
my/output/path/report/
├── another_dir/
│ ├── a_report.memcheck.html.part.js
│ └── other_report.memcheck.html.part.js
├── filename.memcheck.html.part.js
├── index.html
├── memcheck-cover.css
└── memcheck-cover.js
Эта опция доступна только через файл конфигурации (см. Опцию -g |-Generate-Config ).
Это может быть определена путем заполнения следующего ассоциативного массива:
memcheck_path_prefix_replacement[ " <prefix_to_replace> " ]= " <replacement_value> " Где клавиш prefix_to_replace - это префикс пути, который должен быть заменен
И значение value replacement_value - это заменительное значение (оно может быть пустым, чтобы полностью удалить префикс)
Например, настройка:
memcheck_path_prefix_replacement[ " /var/user/repo " ]= " <repo> "Преобразует следующую строку отчета:
==1== at 0x10101042: myFunc() (/var/user/repo/src/lib1/MyClass.cpp:14)
К:
==1== at 0x10101042: myFunc() (<repo>/src/lib1/MyClass.cpp:14)
Можно определить несколько замены
Эта опция доступна только через файл конфигурации (см. Опцию -g |-Generate-Config ).
Это может быть определена путем заполнения следующих ассоциативных массивов (оба необходимы):
memcheck_url_prefix_replacement[ " <path_prefix> " ]= " <repository_url_prefix> "
memcheck_url_prefix_replacement_type[ " <path_prefix> " ]= " <repository_type> " Где ключ path_prefix является префиксом пути файла в корневом каталоге репозитория.
Value repository_url_prefix является префиксом сервера управления источником для репозитория.
Вот какой -то пример:
И Value repository_type является одним из поддерживаемых типов сервера (случай не имеет значения):
Например, настройка:
memcheck_url_prefix_replacement[ " /var/user/repo/ " ]= " https://github.com/example/example_project/blob/master/ "
memcheck_url_prefix_replacement_type[ " /var/user/repo/ " ]= " github "Преобразует следующую строку отчета:
==1== at 0x10101042: myFunc() (/var/user/repo/src/lib1/MyClass.cpp:14)
К:
==1== at 0x10101042: myFunc() (<a href="https://github.com/example/example_project/blob/master/src/lib1/MyClass.cpp#L14">/var/user/repo/src/lib1/MyClass.cpp:14</a>)
Можно определить несколько замены