これはコマンドaarch64-linux-gnu-gcov-4.8であり、Ubuntu Online、Fedora Online、Windowsオンラインエミュレーター、MACOSオンラインエミュレーターなどの複数の無料オンラインワークステーションのXNUMXつを使用してOnWorks無料ホスティングプロバイダーで実行できます。
プログラム:
NAME
gcov-カバレッジテストツール
SYNOPSIS
gcov [-v|- バージョン] [-h| - 助けて]
[-a|-すべてのブロック]
[-b|-ブランチ確率]
[-c|-ブランチカウント]
[-u|-無条件-ブランチ]
[-n|-出力なし]
[-l|-長いファイル名]
[-p|--保存パス]
[-r|-相対のみ]
[-f|-関数-要約]
[-o|-オブジェクトディレクトリ ディレクトリ|ファイル]
[-s|--ソースプレフィックス ディレクトリにジョブを開始します。]
[-d|--表示進行状況]
ファイル
DESCRIPTION
gcov テストカバレッジプログラムです。 GCCと連携して使用し、プログラムを分析して
より効率的で高速に実行されるコードを作成し、テストされていない部分を発見するのに役立ちます
プログラム。 あなたが使用することができます gcov 最適化の場所を見つけるのに役立つプロファイリングツールとして
努力はあなたのコードに最も影響を与えます。 使用することもできます gcov 他のプロファイリングと一緒に
ツール、 gprof、コードのどの部分が最大の計算時間を使用しているかを評価します。
プロファイリングツールは、コードのパフォーマンスを分析するのに役立ちます。 次のようなプロファイラーを使用する gcov
or gprof、次のようないくつかの基本的なパフォーマンス統計を見つけることができます。
・コードの各行が実行される頻度
・実際に実行されるコード行
・コードの各セクションが使用する計算時間
コンパイル時にコードがどのように機能するかについてこれらのことを知ったら、それぞれを見ることができます
どのモジュールを最適化する必要があるかを確認するためのモジュール。 gcov どこで働くかを決めるのに役立ちます
最適化について。
ソフトウェア開発者は、テストスイートと連携してカバレッジテストも使用し、
ソフトウェアは実際にはリリースには十分です。 テストスイートは、プログラムが
期待どおりに機能します。 カバレッジプログラムは、プログラムのどれだけが実行されているかを確認するためにテストします
テストスイート。 開発者は、どの種類のテストケースを追加する必要があるかを判断できます。
より良いテストとより良い最終製品の両方を作成するためのテストスイート。
使用する場合は、最適化せずにコードをコンパイルする必要があります gcov なぜなら
コードのいくつかの行をXNUMXつの関数に結合することによる最適化では、それほど多くのことが得られない場合があります
コードが大量に使用している「ホットスポット」を探す必要があるための情報
コンピューターの時間。 同様に、 gcov 行ごとに統計を蓄積します(最低でも
解像度)、それぞれにXNUMXつのステートメントのみを配置するプログラミングスタイルで最適に機能します
ライン。 ループまたは他の制御構造に展開する複雑なマクロを使用する場合、
統計はあまり役に立ちません---マクロが呼び出す行についてのみ報告します
が表示されます。 複雑なマクロが関数のように動作する場合は、それらをインラインに置き換えることができます
この問題を解決するための機能。
gcov と呼ばれるログファイルを作成します ソースファイル.gcov これは、の各行が何回かを示します
ソースファイル ソースファイル.c 実行しました。 これらのログファイルは、 gprof 〜へ
プログラムのパフォーマンスを微調整するのに役立ちます。 gprof タイミング情報を提供します
あなたが得る情報と一緒に使用することができます gcov.
gcov GCCでコンパイルされたコードでのみ機能します。 他のプロファイリングとは互換性がありません
またはカバレッジメカニズムをテストします。
OPTIONS
-h
- 助けて
使用に関するヘルプを表示する gcov (標準出力上)、何もせずに終了します
さらなる処理。
-v
- バージョン
表示する gcov バージョン番号(標準出力上)、および何もせずに終了します
さらなる処理。
-a
-すべてのブロック
基本ブロックごとに個別の実行カウントを書き込みます。 通常、gcov出力
実行は、行のメインブロックに対してのみカウントされます。 このオプションを使用すると、次のことができます
XNUMX行内のブロックが実行されていないかどうかを判別します。
-b
-ブランチ確率
分岐頻度を出力ファイルに書き込み、分岐要約情報をに書き込みます。
標準出力。 このオプションを使用すると、プログラムの各ブランチの頻度を確認できます。
撮影された。 無条件のブランチは、 -u オプションが与えられます。
-c
-ブランチカウント
分岐頻度を、パーセンテージではなく、取得した分岐の数として記述します
取られた枝の。
-n
-出力なし
作成しないでください gcov 出力ファイル。
-l
-長いファイル名
インクルードされたソースファイルの長いファイル名を作成します。 たとえば、ヘッダーファイルの場合 xh
コードが含まれており、ファイルに含まれていました 交流、次に実行 gcov ファイル上 交流
と呼ばれる出力ファイルを生成します ac ## xhgcov xhgcov。 これは
次の場合に役立ちます xh 複数のソースファイルに含まれていて、個々のファイルを見たい
貢献。 あなたが使用する場合 -p オプション、インクルードファイル名とインクルードファイル名の両方
完全なパス名になります。
-p
--保存パス
生成された名前で完全なパス情報を保持します .gcov ファイル。 それなし
このオプションでは、ファイル名コンポーネントのみが使用されます。 このオプションを使用すると、すべてのディレクトリが
使用され、 / に翻訳された文字 # キャラクター、 . ディレクトリコンポーネントが削除されました
取り外し不可能 .. コンポーネントの名前が ^。 これは、ソースファイルが
いくつかの異なるディレクトリ。
-r
-相対のみ
相対パス名(ソースの後)を持つソースファイルに関する情報のみを出力します
プレフィックス省略)。 絶対パスは通常、システムヘッダーファイルと任意のカバレッジです
その中のインライン関数は通常、面白くありません。
-f
-関数-要約
ファイルレベルの要約に加えて、各関数の要約を出力します。
-o ディレクトリ|ファイル
-オブジェクトディレクトリ ディレクトリにジョブを開始します。
-オブジェクトファイル file
gcovデータファイルを含むディレクトリまたはオブジェクトパス名のいずれかを指定します。
この .gcno, .gcda このオプションを使用してデータファイルを検索します。 ディレクトリが
指定すると、データファイルはそのディレクトリにあり、入力ファイル名にちなんで名前が付けられます。
その拡張なし。 ここでファイルを指定すると、データファイルの名前は次のようになります。
そのファイル、拡張子なし。
-s ディレクトリにジョブを開始します。
--ソースプレフィックス ディレクトリにジョブを開始します。
出力カバレッジファイルを生成するときに削除するソースファイル名のプレフィックス。
このオプションは、別のディレクトリにビルドする場合、およびへのパス名が
出力ファイル名を決定するときにソースディレクトリは必要ありません。 これに注意してください
プレフィックス検出は、ソースファイルが絶対であるかどうかを判断する前に適用されます。
-u
-無条件-ブランチ
分岐確率を指定する場合は、無条件分岐の確率を含めてください。
無条件の分岐は通常、面白くありません。
-d
--表示進行状況
標準出力に進行状況を表示します。
gcov を呼び出したときと同じ現在のディレクトリで実行する必要があります
コンパイラ。 そうしないと、ソースファイルを見つけることができません。 gcov ファイルを生成します
呼ばれます 壊れた名前.gcov 現在のディレクトリにあります。 これらにはカバレッジ情報が含まれています
それらが対応するソースファイルの。 一つ .gcov ファイルはソースごとに作成されます(または
ヘッダー)データファイルを生成するためにコンパイルされたコードを含むファイル。 NS
マングル名 出力ファイル名の一部は通常、単にソースファイル名ですが、
次の場合はもっと複雑になります -l or -p オプションが与えられます。 それらのオプションを参照してください
詳細については。
呼び出す場合 gcov 複数の入力ファイルがある場合、各入力ファイルからの寄与は次のとおりです。
合計。 通常、の最終リンクと同じファイルのリストを使用して呼び出します。
実行可能ファイル。
この .gcov ファイルには、 : プログラムのソースコードとともにフィールドを分離しました。 フォーマット
is
: :
コマンドラインオプションで要求された場合、追加のブロック情報が各行に続く場合があります。
この 実行カウント is - コードを含まない行の場合。 未実行の行はマークされます #####
or ====、例外的でないパスで到達可能か、それとものみ到達可能かによって異なります
それぞれC ++例外ハンドラなどの例外パス。
開始時の情報のいくつかの行には 行番号 ゼロの。 これらの前文行は
フォームの
-:0: :
これらのプリアンブル行の順序と数は、次のように拡張されます。 gcov 開発
進捗状況---変更されないままであることに依存しないでください。 使用する タグ 特定の場所を見つける
前文行。
追加のブロック情報は次の形式です
この 情報 人間が読める形式ですが、機械の構文解析に十分シンプルになるように設計されています
のためにペンを持つ時間も見つけています。
パーセンテージを印刷する場合、0%と100%は、値が次の場合にのみ印刷されます。 正確に 0%および
それぞれ100%。 従来は0%または100%に丸められる他の値は次のとおりです。
代わりに、最も近い非境界値として出力されます。
使用時 gcov、最初にXNUMXつの特別なGCCオプションを使用してプログラムをコンパイルする必要があります。
-fprofile-arcs -ftest-カバレッジ。 これは、コンパイラに追加の生成を指示します
gcovに必要な情報(基本的にはプログラムのフローグラフ)。
必要な追加のプロファイリング情報を生成するためのオブジェクトファイル内の追加のコード
gcovによる。 これらの追加ファイルは、オブジェクトファイルがあるディレクトリに配置されます
位置しています。
プログラムを実行すると、プロファイル出力が生成されます。 ソースファイルごと
でコンパイル -fprofile-arcs、付随する .gcda ファイルはオブジェクトファイルに配置されます
ディレクトリにあります。
Running: gcov プログラムのソースファイル名を引数として使用すると、リストが生成されます
各行の実行頻度とともにコードの。 たとえば、プログラムの場合
と呼ばれる tmp.c、これは基本を使用したときに表示されるものです gcov 施設:
$ gcc -fprofile-arcs -ftest-coverage tmp.c
$a.out
$ gcov tmp.c
ファイルtmp.cで実行された90.00個のソース行の10%
tmp.c.gcovを作成しています。
ファイル tmp.c.gcov からの出力が含まれています gcov。 これがサンプルです:
-:0:ソース:tmp.c
-:0:グラフ:tmp.gcno
-:0:データ:tmp.gcda
-:0:実行:1
-:0:プログラム:1
-:1:#include
-:2:
-:3:int main(void)
1:4:{
1:5:int i、合計;
-:6:
1:7:合計= 0;
-:8:
11:9:for(i = 0; i <10; i ++)
10:10:合計+ = i;
-:11:
1:12:if(合計!= 45)
#####:13:printf( "失敗\ n");
-:14:その他
1:15:printf( "成功\ n");
1:16:0を返します。
-:17:}
あなたが使用している場合 -a オプションを選択すると、個々のブロックカウントが取得され、出力は次のようになります。
このような:
-:0:ソース:tmp.c
-:0:グラフ:tmp.gcno
-:0:データ:tmp.gcda
-:0:実行:1
-:0:プログラム:1
-:1:#include
-:2:
-:3:int main(void)
1:4:{
1:4ブロック0
1:5:int i、合計;
-:6:
1:7:合計= 0;
-:8:
11:9:for(i = 0; i <10; i ++)
11:9ブロック0
10:10:合計+ = i;
10:10ブロック0
-:11:
1:12:if(合計!= 45)
1:12ブロック0
#####:13:printf( "失敗\ n");
$$$$$:13ブロック0
-:14:その他
1:15:printf( "成功\ n");
1:15ブロック0
1:16:0を返します。
1:16ブロック0
-:17:}
このモードでは、各基本ブロックはXNUMX行(ブロックの最後の行)にのみ表示されます。 NS
複数行のブロックは、その最後の行の実行カウントにのみ寄与し、その他
前のブロックがそれらの行で終了しない限り、行にコードが含まれていることは示されません。 NS
行の合計実行数が表示され、後続の行に実行数が表示されます
その行で終わる個々のブロックに対して。 各ブロックの後、ブランチとコールがカウントされます
ブロックのが表示されます。 -b オプションが与えられます。
GCCインスツルメンテーションの呼び出し方法により、呼び出しカウントは、
個々のブロック。 ご覧のとおり、13行目には実行されなかった基本ブロックが含まれています。
あなたが使用している場合 -b オプションの場合、出力は次のようになります。
$ gcov -b tmp.c
ファイルtmp.cで実行された90.00個のソース行の10%
ファイルtmp.cで実行された80.00つのブランチの5%
ファイルtmp.cで少なくとも80.00回取得された5つのブランチのXNUMX%
ファイルtmp.cで実行された50.00つの呼び出しの2%
tmp.c.gcovを作成しています。
結果のサンプルは次のとおりです tmp.c.gcov ファイル:
-:0:ソース:tmp.c
-:0:グラフ:tmp.gcno
-:0:データ:tmp.gcda
-:0:実行:1
-:0:プログラム:1
-:1:#include
-:2:
-:3:int main(void)
1と呼ばれる関数mainは、1%実行された75ブロックを返しました
1:4:{
1:5:int i、合計;
-:6:
1:7:合計= 0;
-:8:
11:9:for(i = 0; i <10; i ++)
ブランチ0は91%を取得しました(フォールスルー)
ブランチ1は9%を取得しました
10:10:合計+ = i;
-:11:
1:12:if(合計!= 45)
ブランチ0は0%を取得しました(フォールスルー)
ブランチ1は100%を取得しました
#####:13:printf( "失敗\ n");
呼び出し0は実行されませんでした
-:14:その他
1:15:printf( "成功\ n");
呼び出し0呼び出し1は100%を返しました
1:16:0を返します。
-:17:}
関数ごとに、関数が呼び出された回数とその方法を示す行が出力されます。
何度も返され、関数のブロックの何パーセントが実行されたか。
基本ブロックごとに、基本ブロックの最後の行の後にXNUMX行が出力されます。
基本ブロックを終了するブランチまたはコール。 複数のブランチとコールが存在する可能性があります
その行で終わる複数の基本ブロックがある場合、単一のソース行に対してリストされます。
この場合、ブランチとコールにはそれぞれ番号が付けられます。 簡単な方法はありません
これらのブランチをマップし、ソースコンストラクトにコールバックします。 ただし、一般的には最低です
番号付きのブランチまたはコールは、ソース行の左端の構成に対応します。
ブランチの場合、少なくともXNUMX回実行された場合、パーセンテージは
ブランチが実行された回数をブランチが実行された回数で割ると、
印刷されます。 それ以外の場合は、「実行されませんでした」というメッセージが出力されます。
通話の場合、少なくともXNUMX回実行された場合は、その数を示すパーセンテージ
返された呼び出しを呼び出しが実行された回数で割った回数は、
印刷されます。 これは通常100%ですが、「exit」または
「longjmp」であるため、呼び出されるたびに返されるとは限りません。
実行回数は累積されます。 サンプルプログラムを実行せずに再度実行した場合
を削除する .gcda ファイルの場合、ソースの各行が
実行されたものは、前の実行の結果に追加されます。 これは潜在的に有用です
いくつかの方法で。 たとえば、複数のデータを蓄積するために使用できます。
プログラムは、テスト検証スイートの一部として、またはより正確な長期を提供するために実行されます
多数のプログラム実行に関する情報。
内のデータ .gcda ファイルは、プログラムが終了する直前に保存されます。 それぞれについて
でコンパイルされたソースファイル -fprofile-arcs、プロファイリングコードは最初に読み取りを試みます
既存の .gcda ファイル; ファイルが実行可能ファイルと一致しない場合(基本の数が異なる
ブロックカウント)ファイルの内容を無視します。 次に、新しい実行を追加します
カウントし、最後にデータをファイルに書き込みます。
使い方 gcov GCC 最適化
使用する予定がある場合 gcov コードを最適化するには、最初にプログラムをコンパイルする必要があります
XNUMXつの特別なGCCオプションを使用: -fprofile-arcs -ftest-カバレッジ。 それとは別に、あなたはすることができます
他のGCCオプションを使用します。 ただし、プログラムのすべての行がそのことを証明したい場合
が実行された場合、最適化と同時にコンパイルしないでください。 一部のマシンでは
オプティマイザーは、他の行と組み合わせることにより、いくつかの単純なコード行を削除できます。
たとえば、次のようなコードを使用します。
if(a!= b)
c = 1;
ほかに
c = 0;
一部のマシンでは、XNUMXつの命令にコンパイルできます。 この場合、
gcov 個別に実行されていないため、行ごとに個別の実行カウントを計算します
各行のコード。 従って gcov プログラムをコンパイルした場合の出力は次のようになります
最適化あり:
100:12:if(a!= b)
100:13:c = 1;
100:14:その他
100:15:c = 0;
出力は、このコードブロックが最適化によって組み合わされて100回実行されたことを示しています。
ある意味では、この結果は正しいです。これは、を表す命令がXNUMXつしかないためです。
これらのXNUMX行すべて。 ただし、出力には結果の回数は示されません
は0で、結果は1でした。
インライン化可能な関数は、予期しない行数を作成する可能性があります。 の行数が表示されます
インライン化可能な関数のソースコードですが、表示される内容は関数の場所によって異なります
インライン化されているか、まったくインライン化されていない場合。
関数がインライン化されていない場合、コンパイラーは、
関数、それを必要とする任意のオブジェクトファイル。 もしも ファイルA.o と ファイルB.o 両方が含まれています
特定のインライン化できない機能のラインボディ、それらは両方ともカバレッジを含みます
その機能のために数えます。 いつ ファイルA.o と ファイルB.o 一緒にリンクされている場合、リンカーは、
多くのシステムでは、その関数へのすべての呼び出しに対して、行外の本体のXNUMXつを選択します。
もう一方を削除または無視します。 残念ながら、カバレッジカウンターは削除されません
未使用の機能本体用。 したがって、インストルメント化された場合、その機能のXNUMXつを除くすべての使用
ゼロカウントが表示されます。
関数が複数の場所にインライン化されている場合、各場所のブロック構造は次のようになります。
同じではありません。 たとえば、条件はコンパイル時に計算できるようになりました。
いくつかのインスタンス。 インライン関数のすべての使用法のカバレッジが表示されるため
同じソース行の場合、行数自体に一貫性がないように見える場合があります。
長時間実行されるアプリケーションは、「_ gcov_reset」および「_gcov_dump」機能を使用して
プロファイルの収集を対象のプログラム領域に制限します。 「_gcov_reset(void)」の呼び出し
すべてのプロファイルカウンターをゼロにクリアし、「_ gcov_dump(void)」を呼び出すと、
その時点で収集され、ダンプされるプロファイル情報 .gcda 出力ファイル。
onworks.netサービスを使用してオンラインでaarch64-linux-gnu-gcov-4.8を使用する