1

gcov を使用して、プロジェクトの実行されたすべてのコード行を取得したいと考えています。たとえば、次のようなコード:

int main()
{
   int i=0;
   for(i=0;i<3;i++)printf("Hello");
   return 0;
}

結果は次のようになります。

1)int i=0;
2)for(i=0;i<3;i++)
3)printf("Hello");
4)for(i=0;i<3;i++)
5)printf("Hello");
6)for(i=0;i<3;i++)
7)printf("Hello");
8)for(i=0;i<3;i++)
9)return 0;

主なアイデアは、libgcov を書き換えて gcov 関数を独自に実装することです。その後はgcc -fprofile-arcs -ftest-coverage test.c -o test -lanothergcovと組み合わせて使用​​します。

それで、そのようなことをするのは正しいですか、それともうまくいきませんか、それが提供しない必要な情報を得るために gcov のソースコードを操作した経験がある人はいますか?

4

1 に答える 1

1

それは単に libgcov を書き換えただけでは不可能です。すべての行の間にカウンターインクリメント命令を挿入する、対応する gcc コードを書き直す必要があります。

インストルメンテーションの後、コードは基本的に次のように実行されます。

 crt0: 
     __gcov_init(main_locals);
     main();
     __gcov_exit(); // dump the counters to files

 int main() {
     static GcovStruct_t local;
     local.Counter[0]++;
     for (i=0;i<3;i++) {
     local.Counter[1]++;
     printf("Hello");
     local.Counter[2]++;
     }
     local.Counter[3]++;
 }


<prompt> gcc -S -fprofile-arcs -ftest-coverageただし、中間の .s ファイルを取得するために使用できるため、何かする必要があるかもしれません。

    movq    .LPBX1(%rip), %rax
    addq    $1, %rax
    movq    %rax, .LPBX1(%rip)

これは、検索と置換によって次のように変更するのはほとんど簡単です。

    movq    .LPBX1(%rip), %rax   -> leaq    .LPBX1(%rip), %rax
    addq     $1, %rax            -> pushq %rax
                                    call     __init_add_line_number_to_list
    movq    %rax, .LPBX1(%rip)   -> -- remove this --

次に、新しく導入されたルーチンで qword ポインターをインクリメントし、そのアドレスを、次に変更する gcov ツールによって処理される追加の構造に挿入する必要があります。

于 2013-01-09T14:02:40.057 に答える