La couverture Memcheck fournit une assistance bash pour l'analyse Valgrind Memcheck.
Il fournit également un générateur de rapports HTML formatant les rapports Valgrind RAW et mettant en évidence des pièces importantes pour vous aider à interpréter ces résultats.
Il peut facilement être utilisé dans votre environnement CI pour générer automatiquement des rapports.
Une démonstration étant meilleure que tous les mots, vous pouvez trouver un exemple de rapport HTML généré ici.
Le script memcheck_runner.sh est un wrapper qui exécutera un binaire sous l'outil Memcheck de Valgrind.
Pour que le script memcheck_runner.sh fonctionne, les outils suivants doivent être installés et accessibles à l'aide de la variable d'environnement de chemin:
bash Bash version 4 et Upper Only sont pris en charge.valgrind Valgrind version 3.13 a été testé, la version ancienne pourrait ne pas fonctionner comme prévu Voici son utilisation (elle peut être accessible en utilisant l'option --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.
La seule option obligatoire est le --output-name , qui définira le chemin et le nom du fichier de sortie.
Si le chemin n'existe pas, il sera créé.
L'extension .memcheck y sera automatiquement ajoutée pour compatibilité avec le script generate_html_report.sh .
Exemple:
$ 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 " Vous pouvez spécifier un fichier de suppression de violation à l'aide de l'option --ignore .
Ce fichier de suppression doit suivre les règles de fichier de suppression de Valgrind.
Les suppressions peuvent être générées dans le rapport à l'aide de l'option --gen-suppressions .
La suppression ressemblera à celle du rapport:
[...]
==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
[...]
Cet appel sortira le rapport de Valgind dans le fichier filename.memcheck dans le répertoire my/output/path/ , qui dans cet exemple a été créé.
L'analyse Valgrind a été exécutée en utilisant le true binaire, en lui faisant passer de nombreux paramètres.
De la documentation de 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.
Le passage du --fullpath-after à memcheck_runner.sh le transmettra directement à Valgrind, ayant l'effet décrit précédemment.
Pour l'instant, les options de Valgrind ne sont pas personnalisables.
Les options suivantes sont utilisées:
--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=yesPour plus de détails, veuillez vous référer à la documentation de Valgrind.
Le script generate_html_report.sh générera un rapport HTML avec tous les fichiers de résultats memcheck dans un répertoire donné.
Pour que le script generate_html_report.sh fonctionne, les outils suivants doivent être installés et accessibles à l'aide de la variable d'environnement Path:
bash Bash version 4 et Upper Only sont pris en charge.gawk GNU AWK 4.1.4 a été testé, la version ancienne pourrait ne pas fonctionner comme prévu Voici son utilisation (elle peut être accessible en utilisant l'option --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.
Il y a deux paramètres obligatoires au générateur:
--input-dir qui définit le chemin où les rapports MEMCHECK à traiter sont..memcheck qu'il trouve.--output-dir qui définit le chemin dans lequel le rapport HTML sera généré. Si les paramètres de violation par défaut ne vous conviennent pas, chaque criticité de violation peut être ajustée.
Un fichier de configuration, avec tous les paramètres de criticité disponibles et leurs valeurs par défaut, peut être généré à l'aide de l'option --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. Le fichier de configuration par défaut est généré dans le répertoire actuel dans le fichier memcheck-cover.config .
Vous pouvez ensuite modifier n'importe quelle criticité pour répondre à vos besoins et le transmettre au générateur à l'aide de l'option --config .
Si une criticité est manquante dans le fichier, la par défaut sera appliquée.
Le passage de n'importe quel fichier de configuration avec des paramètres non valides ou des valeurs de paramètres entraînera une erreur.
Par exemple:
Error: Invalid configuration value 'dummy' for parameter: memcheck_violation_criticality['contains_unaddressable'] => La criticité dummy n'existe pasError: Invalid configuration parameter: memcheck_violation_criticality['dummy_param'] => La touche dummy_param n'existe pas pour memcheck_violation_criticalityVoici un exemple de génération, avec l'arbre suivant:
my/output/path/
├── another_dir/
│ ├── a_report.memcheck
│ └── other_report.memcheck
└── filename.memcheck
Exécutons le générateur 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...Le résultat ressemblera à ceci:
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
Cette option est uniquement disponible via le fichier de configuration (voir -g | - GENERETERIE-CONFIG Option).
Il peut être défini en remplissant le tableau associatif suivant:
memcheck_path_prefix_replacement[ " <prefix_to_replace> " ]= " <replacement_value> " Où la clé prefix_to_replace est le préfixe du chemin à remplacer
Et la valeur replacement_value est la valeur de remplacement (il peut être laissé vide pour supprimer complètement le préfixe)
Par exemple, paramètre:
memcheck_path_prefix_replacement[ " /var/user/repo " ]= " <repo> "Convertirait la ligne de rapport suivante:
==1== at 0x10101042: myFunc() (/var/user/repo/src/lib1/MyClass.cpp:14)
À:
==1== at 0x10101042: myFunc() (<repo>/src/lib1/MyClass.cpp:14)
Plusieurs remplacements peuvent être définis
Cette option est uniquement disponible via le fichier de configuration (voir -g | - GENERETERIE-CONFIG Option).
Il peut être défini en remplissant les tableaux associatifs suivants (les deux sont nécessaires):
memcheck_url_prefix_replacement[ " <path_prefix> " ]= " <repository_url_prefix> "
memcheck_url_prefix_replacement_type[ " <path_prefix> " ]= " <repository_type> " Où la clé path_prefix est le préfixe de chemin de fichier au répertoire racine du référentiel.
La valeur repository_url_prefix est le préfixe du serveur de contrôle source du référentiel.
Voici quelques exemples:
Et la valeur repository_type est l'un des types de serveurs pris en charge (le cas n'a pas d'importance):
Par exemple, paramètre:
memcheck_url_prefix_replacement[ " /var/user/repo/ " ]= " https://github.com/example/example_project/blob/master/ "
memcheck_url_prefix_replacement_type[ " /var/user/repo/ " ]= " github "Convertirait la ligne de rapport suivante:
==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>)
Plusieurs remplacements peuvent être définis