Memcheck Cover bietet einen Bash -Helfer für die Valgrind -Memcheck -Analyse.
Es bietet auch ein HTML -Berichtsgenerator, das Valgrind -RAW -Berichte formatiert und wichtige Teile hervorhebt, um diese Ergebnisse zu interpretieren.
Es kann problemlos in Ihrer CI -Umgebung verwendet werden, um automatisch Berichte zu erstellen.
Eine Demonstration, die besser ist als alle Wörter, finden Sie hier ein generiertes HTML -Bericht.
Das Skript memcheck_runner.sh ist eine Wrapper, die unter Valgrinds Memcheck -Tool eine Binärdatei ausführt.
Damit das Skript memcheck_runner.sh funktioniert, müssen die folgenden Tools mithilfe der Pfadumgebungsvariable installiert und zugänglich sein:
bash Bash Version 4 und obere nur werden unterstützt.valgrind Valgrind Version 3.13 wurde getestet, ältere Version funktioniert möglicherweise nicht wie beabsichtigt Hier ist die Verwendung (kann mit der Option --help ) zugegriffen werden):
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.
Die einzige obligatorische Option ist der --output-name , der den Ausgabedateipfad und den Namen definiert.
Wenn der Pfad nicht existiert, wird er erstellt.
Die Erweiterung .memcheck wird ihr automatisch für die Kompatibilität mit dem Skript generate_html_report.sh hinzugefügt.
Beispiel:
$ 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 " Sie können eine Verstößenunterdrückungsdatei mit der Option --ignore angeben.
Eine solche Unterdrückungsdatei muss die Regeln von Valgrinds Unterdrückungsdatei befolgen.
Unterdrückungen können innerhalb des Berichts unter Verwendung der Option --gen-suppressions generiert werden.
Die Unterdrückung sieht im Bericht so aus:
[...]
==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
[...]
Dieser Aufruf gibt den Bericht des Valginds in die filename.memcheck in der Datei my/output/path/ verzeichnis, die in diesem Beispiel erstellt wurde.
Die Valgrind -Analyse wurde unter Verwendung des true Binärdatums durchgeführt, wobei es viele Parameter überholte.
Aus Valgrinds Dokumentation:
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.
Wenn Sie den --fullpath-after an memcheck_runner.sh übergeben, wird es direkt an Valgrind weitergeleitet, wobei der zuvor beschriebene Effekt.
Derzeit sind die Optionen von Valgrind nicht anpassbar.
Die folgenden Optionen werden verwendet:
--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=yesWeitere Informationen finden Sie in der Dokumentation der Valgrind.
Das Skript generate_html_report.sh generiert einen HTML -Bericht mit allen Memcheck -Ergebnisdateien in einem bestimmten Verzeichnis.
Damit das Skript generate_html_report.sh funktioniert, müssen die folgenden Tools mithilfe der Pfadumgebungsvariablen installiert und zugänglich sein:
bash Bash Version 4 und obere nur werden unterstützt.gawk Gnu awk 4.1.4 wurde getestet, ältere Version funktioniert möglicherweise nicht wie beabsichtigt Hier ist die Verwendung (kann mit der Option --help ) zugegriffen werden):
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.
Der Generator enthält zwei obligatorische Parameter:
--input-dir , das den Pfad definiert, auf dem die zu verarbeitenden Memcheck berichtet..memcheck Datei verarbeitet, die er findet.--output-dir , das den Pfad definiert, in dem der HTML-Bericht erstellt wird. Wenn die Standardverletzungseinstellungen nicht zu Ihnen passen, kann jede Verstoßkritikalität angepasst werden.
Eine Konfigurationsdatei mit allen verfügbaren Kritikalitätseinstellungen und deren Standardwerten kann mit der Option --generate-config Option generiert werden:
$ 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. Die Standardkonfigurationsdatei wird im aktuellen Verzeichnis in der memcheck-cover.config generiert.
Sie können dann jede Kritikalität so ändern, dass sie Ihren Anforderungen entspricht, und sie mit der Option --config an den Generator weitergeben.
Wenn in der Datei eine Kritikalität fehlt, wird die Standardeinstellung angewendet.
Das Übergeben einer beliebigen Konfigurationsdatei mit ungültigen Parametern oder Parameterwerten führt zu einem Fehler.
Zum Beispiel:
Error: Invalid configuration value 'dummy' for parameter: memcheck_violation_criticality['contains_unaddressable'] => Die dummy -Kritikalität existiert nichtError: Invalid configuration parameter: memcheck_violation_criticality['dummy_param'] => Die dummy_param -Taste existiert nicht für memcheck_violation_criticalityHier ist ein Generationsbeispiel mit dem folgenden Baum:
my/output/path/
├── another_dir/
│ ├── a_report.memcheck
│ └── other_report.memcheck
└── filename.memcheck
Lassen Sie uns den HTML -Generator ausführen:
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...Das Ergebnis wird so aussehen:
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
Diese Option ist nur über die Konfigurationsdatei verfügbar (siehe Option -g |-generiert-config ).
Es kann definiert werden, indem das folgende assoziative Array gefüllt wird:
memcheck_path_prefix_replacement[ " <prefix_to_replace> " ]= " <replacement_value> " Wobei das wichtigste prefix_to_replace das Präfix des Pfades ist, das ersetzt werden soll
Und der Value replacement_value ist der Ersatzwert (er kann leer gelassen werden, um das Präfix vollständig zu entfernen)
Zum Beispiel Einstellung:
memcheck_path_prefix_replacement[ " /var/user/repo " ]= " <repo> "Würde die folgende Berichtslinie umwandeln:
==1== at 0x10101042: myFunc() (/var/user/repo/src/lib1/MyClass.cpp:14)
Zu:
==1== at 0x10101042: myFunc() (<repo>/src/lib1/MyClass.cpp:14)
Mehrere Ersetzungen können definiert werden
Diese Option ist nur über die Konfigurationsdatei verfügbar (siehe Option -g |-generiert-config ).
Es kann definiert werden, indem die folgenden assoziativen Arrays füllen (beide werden benötigt):
memcheck_url_prefix_replacement[ " <path_prefix> " ]= " <repository_url_prefix> "
memcheck_url_prefix_replacement_type[ " <path_prefix> " ]= " <repository_type> " Wobei das Key path_prefix das Dateipfadpräfix für das Repository -Root -Verzeichnis ist.
Das Value repository_url_prefix ist das Präfix des Quellungssteuerservers für das Repository.
Hier sind ein Beispiel:
Und das Value repository_type ist einer der unterstützten Servertypen (Fall spielt keine Rolle):
Zum Beispiel Einstellung:
memcheck_url_prefix_replacement[ " /var/user/repo/ " ]= " https://github.com/example/example_project/blob/master/ "
memcheck_url_prefix_replacement_type[ " /var/user/repo/ " ]= " github "Würde die folgende Berichtslinie umwandeln:
==1== at 0x10101042: myFunc() (/var/user/repo/src/lib1/MyClass.cpp:14)
Zu:
==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>)
Mehrere Ersetzungen können definiert werden