[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2 gcov の起動方法

 
gcov [-b] [-v] [-n] [-l] [-f] [-o directory] sourcefile
-b

分岐頻度を出力ファイルに書きだし、分岐に関する要約情報を標準出力に 書き出す。 このオプションを指定することで、プログラム中のそれぞれの分岐が どれぐらい成立しているかを知ることができる。

-v

gcov のバージョン番号を標準エラー出力に表示する

-n

gcov の出力ファイルを作らない。

-l

インクルードされたソースファイルに対して長いファイル名を使う。 例えば、ヘッダファイル ‘x.h’ がコードを含んでいて、 ‘a.c’ からインクルードされている場合、gcov を ‘a.c’ に対して実行すると、出力ファイルとして、‘x.h.gcov’ ではなくて ‘a.c.x.h.gcov’ という名前のファイルを作る。 これは、‘x.h’ が複数のソースファイルからインクルードされている 場合に役に立つ。

-f

ファイル単位の要約に加えて、関数単位の要約を出力する。

-o

オブジェクトファイルが置かれているディレクトリを指定する。 gcov は、これで指定されたディレクトリから、.bb.da という 拡張子が付いたファイルを探す。

gcov を使うには、まずプログラムをコンパイルするときに GNU CC の特別なオプションを二つ指定しなければならない。 ‘-fprofile-arcs -ftest-coverage’ である。 これを指定するとコンパイラは、gcov で必要とされる付加的な情報 (基本的にはプログラムのフローグラフ)を生成し、また、gcov で 必要とする余分のプロファイリング情報を生成するためにオブジェクトファイルに 付加的なコードを追加する。 これらの付加的なファイルは、ソースコードが置かれているディレクトリに 置かれる。

プログラムを実行させると、プロファイル出力が生成される。 ‘-fprofile-arcs’ を指定してコンパイルしたソースファイル毎に、 .da という拡張子が付いたファイルがソースディレクトリに置かれる。

gcov の引数にプログラムのソースファイル名を指定して実行させると、 今度は各行毎の実行頻度が付いたコードのリスティングが出力される。 例えば、読者のプログラムが ‘tmp.c’ であるとすると、 gcov の基本的な機能を使ったときに表示されるものは以下のようになる。

 
$ gcc -fprofile-arcs -ftest-coverage tmp.c
$ a.out
$ gcov tmp.c
 87.50% of 8 source lines executed in file tmp.c
Creating tmp.c.gcov.

ファイル ‘tmp.c.gcov’ に gcov の出力が含まれている。 以下に例を示す。

 
                main()
                {
           1      int i, total;
                
           1      total = 0;
                
          11      for (i = 0; i < 10; i++)
          10        total += i;
                
           1      if (total != 45)
      ######        printf ("Failure\n");
                  else
           1        printf ("Success\n");
           1    }

-b’ オプションを使うと、出力は以下のようになる。

 
$ gcov -b tmp.c
 87.50% of 8 source lines executed in file tmp.c
 80.00% of 5 branches executed in file tmp.c
 80.00% of 5 branches taken at least once in file tmp.c
 50.00% of 2 calls executed in file tmp.c
Creating tmp.c.gcov.

この場合できる ‘tmp.c.gcov’ の例は以下の通り。

 
                main()
                {
           1      int i, total;
                
           1      total = 0;
                
          11      for (i = 0; i < 10; i++)
branch 0 taken = 91%
branch 1 taken = 100%
branch 2 taken = 100%
          10        total += i;
                
           1      if (total != 45)
branch 0 taken = 100%
      ######        printf ("Failure\n");
call 0 never executed
branch 1 never executed
                  else
           1        printf ("Success\n");
call 0 returns = 100%
           1    }

基本ブロック毎に、その基本ブロックの最後の行の後に一行表示が追加され、 基本ブロックの終りとなる分岐や呼び出しを記述する。 あるソースの一行で終わる基本ブロックが複数ある場合は、 その行にリストされる分岐や呼び出しは複数個存在する可能性がある。 その場合、分岐と呼び出しはそれぞれ与えられた数となる。 これらの分岐と呼び出しをソースコードの構文に対応させる簡単な方法はない。 だが、一般には一番小さい番号の分岐や呼び出しが、そのソース行の 一番左側の構文に対応する。

分岐の場合、それが少なくとも一回でも実行されたなら、 分岐が成立した回数を分岐を実行した回数で割ったものをパーセンテージで 表したものが表示される。 一回も実行されなければ、“never executed” というメッセージが表示される。

呼び出しの場合、それが少なくとも一回でも実行されたなら、 その呼び出しから戻ってきた回数を呼び出しが実行された回数で割ったものを パーセンテージで表したものが表示される。 これは普通は 100% になるが、exitlongjmp を呼び出している 関数の場合はこれより小さくなることもある。そういう関数は、呼び出されたときに 戻ってこない可能性がある。

実行回数は累積される。.da ファイルを消さずにサンプルプログラムを もう一回実行すると、ソースの各行が実行された回数が前回の実行結果に 追加される。これは色々な面で役に立つ可能性がある。 例えば、ある検証テストスイートの一部として実行する多数のプログラムに ついてデータを蓄積したり、非常に多くのプログラムの実行について より正確な長期的な情報を提供するのに使うことができる。

.da ファイル中のデータは、プログラムが終了する直前にセーブされる。 ‘-fprofile-arcs’ 付きでコンパイルされたソースファイル毎に、 プロファイリング用コードがまず、存在する .da ファイルを 読み込もうとする。そのファイルが実行形式にマッチしない(基本ブロックの 回数値の数が異なる)場合は、そのファイルの内容を無視する。 次に、新しい実行回数値を追加し、最後にデータをファイルに書き出す。


This document was generated using texi2html 1.78.