+ カバレージのツール
created 2006-12-07 modified 2011-03-09
Linuxの話
gcc, gcov, gprof
コンパイルするときに特定フラグを足すことで、なんらかの埋め込みとかなんらかの追加ライブラリのリンクをするらしい。
それで実行ファイルを動かすと、集計された情報が吐き出される。
その情報をgcovやgprofで可視化する。
gcovはカバレージに焦点をあてるもの
gprofはCPU使用率に焦点をあてるもの
らしい。
ただし、gcovとgprofは同じ実行ファイルで併用しないほうがいい。
gcov用の出力がかなり時間を喰うらしく、gprofの結果が役に立たなくなってしまう。
コンパイル
gcc -pg -fprofile-arcs -ftest-coverage ほげ.c -o ほげコンパイルのときに
ほげ.gcnoができる。このファイルはプログラムのブロックや行を記憶してる。
で、プログラムを実行する。デーモン系のプロセスでやるときは、バックグラウンドにまわさないこと。どうやらatexit()で出力処理を仕掛けてるらしい。
実行したプロセスを停止すると
ほげ.gcdaができる。このファイルは通過回数を記憶してる。
gcno と gcda があるディレクトリで
gcov ほげ.cすると、ほげ.gcov (テキストファイル)ができる。
ソースをいじらない限りは、何回もプロセスを起動&停止してテストしても通過回数の合計をカウントしてくれる。
ソースをいじって再コンパイルすると情報がおかしくなるので、.gcdaファイルを消したほうがいい。
情報ソース
info m gcc m gcov
Solaris10 (intel CPU) の話
Solaris の場合
tcovというものがある。
元ソース
$ cat main.cpp #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <string> using namespace std; int main( int argc, char **argv ) { if( argc < 2 ) { printf( "here1" "\n" ); } else { printf( "here2" "\n" ); } return EXIT_SUCCESS; }
コンパイル:
-xprofile=tcovをつける。
$ CC -g -xprofile=tcov main.cpp
テスト作業:
普通に実行する。
$ ./a.out $ ./a.out $ ./a.out $ ./a.out hoge
実行ファイル名.profile/tcovdができている。
結果ファイルの可視化:
tcov -x 実行ファイル名.profile ソースファイル名とやると、
ソースファイル名.tcovテキストファイルができる。
$ tcov -x a.out.profile main.cpp
結果確認:
$ cat main.cpp.tcov #include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <string> using namespace std; int main( int argc, char **argv ) 4 -> { if( argc < 2 ) 3 -> { printf( "here1" "\n" ); } else 1 -> { printf( "here2" "\n" ); } 4 -> return EXIT_SUCCESS; } Top 10 Blocks Line Count 12 4 22 4 14 3 18 1 4 Basic blocks in this file 4 Basic blocks executed 100.00 Percent of the file executed 12 Total basic block executions 3.00 Average executions per basic block
コンパイルしなおした場合:
Solaris の CC と tcov の場合、コンパイルしなおすとカウントがゼロに戻るみたい。ソースファイル単位なのか実行ファイル単位なのかは未検証。
ズレる
manによると「空returnする関数があるとずれる」そうです。そのせいなのか不明だけど、仕事で使おうとしたらズレズレで断念しました。情報ソース
man CC man tcov