Adult-Oriented Punk!

+ カバレージのツール

last mod.2020/05/08 


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



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