JenkinsのValgrind Pluginを使ってみる

JenkinsのValgrind Pluginの使い方をまとめます。

valgrindの使い方についてはこちらを参照して下さい。

Debian 8で実行しています。

 

1 Valgrind Pluginとは

Valgrindを実行し、Jenkins上で結果を閲覧するプラグインです。

Valgrindの実行をValgrind Pluginに任せても独自に実行しても構いません。

2 valgrindのインストール

テスト実行環境にvalgrindをインストールします。Debian 8なのでapt-getでインストールします。

$ sudo apt-get install -y valgrind

3 Valgrind Pluginのインストール

Jenkinsのプラグイン制御画面からインストールします。

Jenkinsの管理 -> プラグインの管理 -> 利用可能

https://dl-web.dropbox.com/s/quu7bu5m6zl7nro/0001_Valgrind-Install.png

4 システムの設定

システムの設定のValgrind PublisherでValgrind検出箇所で表示するソースコードの行数を指定します。

Jenkinsの管理 -> システムの設定 -> Valgrind Publisher

https://dl-web.dropbox.com/s/0udflthmn2tjzf9/0002_Valgrind-Publisher-System.png

 

Stacktrace, prefix lines of code Valgrind検出箇所で表示する前部分の行数
Stacktrace, suffix lines of code Valgrind検出箇所で表示する後部分の行数

 

5 ジョブの設定

5.1 ビルド手順の追加(Run Valgrind)

Run Valgrindでvalgrindの挙動を制御します。

https://dl-web.dropbox.com/s/i0l5w914so348l6/0003_RunValgrind-Setting.png

主だったパラメータは以下の通りです。

 

Executable Include Pattern valgrindを実行するプログラム名(パターンマッチング)
Executable Exclude Pattern valgrindを実行しないプログラム名(パターンマッチング)
File Ending valgrind実行結果を保存するファイルのアペンディクス

 

Executable Include Patternに指定したパターンにマッチするプログラムに全てついてvalgrindが実行されます。

例えば、memleak1とmemleak2というプログラムがあった場合、memleak*を指定します。

 

Executable Exclude PatternはExecutable Include Patternの結果から除外するパターンを指定します。

例えば、memleak1とmemleak2というプログラムは実行したいが、memleak1.cとmemleak2.cを除外する場合は*.cを指定します。

 

File Endingに.valgrind.xmlを指定すると各プログラムに対して、以下の名前のxmlファイルにvalgrind実行結果が保存されます。

<program>.<pid>.valgrind.xml

5.2 ビルド後の処理の追加(Publish Valgrind results)

Report PatternにFile Endingで作成されたファイル名のパターンを指定します。

パターンではなく完全一致でも問題ありません。

https://dl-web.dropbox.com/s/gf2hjgs21lq0bg1/0004_Publish-Valgrind-Results.png

5.3 ビルド手順の追加(独自の手順)

Run Valgrindは若干柔軟性に欠けるので(ディレクトリ変更に対応できない等)、独自にシェルスクリプトを実行してxmlファイルを出力しても良いでしょう。

以下のコマンドは/var/lib/jenkinsディレクトリ配下でJenkinsを動作させ、Run Valgrindの実行した場合と同等です。

$ valgrind --tool=memcheck --leak-check=full --show-reachable=no \
--undef-value-errors=no --track-origins=no \
--child-silent-after-fork=no --trace-children=no \
--gen-suppressions=no --xml=yes \
--xml-file=/var/lib/jenkins/jobs/a/workspace/memleak.%p.valgrind.xml \
/var/lib/jenkins/jobs/a/workspace/memleak

6 コンソール出力

memleakというプログラムに対して、コンソールに以下のように出力されました。

$ valgrind --version
[Valgrind] detected valgrind version (valgrind): 3.10.0
[Valgrind] includes files: memleak
[Valgrind] working dir: /var/lib/jenkins/jobs/a/workspace
[workspace] $ valgrind --tool=memcheck --leak-check=full
--show-reachable=no --undef-value-errors=no --track-origins=no
--child-silent-after-fork=no --trace-children=no
--gen-suppressions=no --xml=yes
--xml-file=/var/lib/jenkins/jobs/a/workspace/memleak.%p.valgrind.xml
/var/lib/jenkins/jobs/a/workspace/memleak
[Valgrind] valgrind exit code: 0
[Valgrind] Files to copy:
[Valgrind] memleak.16916.valgrind.xml
[Valgrind] Copying memleak.16916.valgrind.xml to
/var/lib/jenkins/jobs/a/builds/1/valgrind-plugin/valgrind-results/memleak.16916.valgrind.xml
[Valgrind] Analysing valgrind results
[Valgrind]'/mnt/valgrind-3.10.0/coregrind/m_replacemalloc/vg_replace_malloc.c'
does not exist, source code won't be available
[Valgrind] copying source file
'/var/lib/jenkins/jobs/a/workspace/memleak.c' to 'source_2.tmp'...
[Valgrind] workspacePath: /var/lib/jenkins/jobs/a/workspace/
[Valgrind] Ending the valgrind analysis.

7 結果

Valgrind実行結果のグラフを見ることができます。

https://dl-web.dropbox.com/s/7yqsv7x8lsu51r9/0005_Valgrind-Trend.png

Valgrind実行結果の詳細も見ることができます。

https://dl-web.dropbox.com/s/se3il16m2peifcw/0006_Valgrind-Detail.png