hiro99ma blog

lcovでエラーになるのでgcovrに変更

2025/09/13

C言語でプログラムを書いて単体テストをしているのだが、カバレッジ状況を目視したいと gcov / lcov を使おうとした。
が、gcov は gcc -coverage で(たぶん)うまいことやってくれたものの lcovgeninfo でエラーになった。
昔はこのくらいのオプションで実行できたのだが。。。と調べると記事があった。

そうそう、これこれ。
以前もあって、酒を飲みながらやっていたのであまり覚えていないが同じことをどこかで見つけて対応した気がする。
今の lcov v2 だとうまいこといかないので v1 に戻すという対処だ。
Ubuntu の apt install lcov だと私も v2.0-1 になっていたのでそれで対処できるのだろう。

ただ、これを書いている時点の最新 lcov は v2.3.2だ。 2025年8月25日リリースなのでもしかしたら直っているかもしれない。
まあ Issue #398 が Open のままなので無理かもしれん。

lcov のインストール

とはいえ試さないときになるのでインストールしてみる。

インストール時はビルドするというよりもコピーする感じ?
make install だけだと自動で /usr/local が使われるし、DESTDIR を指定してもその下に ./usr/local が作られるだけだ。
make PREFIX=$HOME/.local install のように書くと指定したディレクトリの下にインストールされる。

ただ、これでインストールしても実行すると Can't locate Capture/Tiny.pm in @INC(以下略) とエラーになってしまう。
“3. Dependencies:” に書いてある perl パッケージがインストールされていないのだろう。
例えば perl -MCPAN -e 'install(Capture::Tiny)' などとしてインストールすることになる。
何が足りないかはエラーメッセージに “(you may need to install the XXX module)” となっているのを参考にすると良いだろう。
良いだろうが、かなり面倒だ。 しかもインストール時にテストか何か走っているのか1つ1つに時間がかかる。 lcov に一括インストールするスクリプトが入っていないか探してみたが、なさそうだ。

$ lcov --version
lcov: LCOV version 2.3.2-2.g3ed1c3d

しかし、結果としては同じく “ERROR: (inconsistent) mismatched end line” になった。

gcovr

lcov の問題なので別のツールを探してみた。
gcovrを使ってみよう。
pip install --user だと “externally-managed-environment” になったので、よくわからんが pipx というのをインストールして使った。

$ pipx install gcovr
  installed package gcovr 8.3, installed using Python 3.12.3
  These apps are now globally available
    - gcovr
done! ✨ 🌟 ✨

lcov の代わりにこういう感じで使うと同じようなフォーマットの HTML ファイルを出力した。
今のところこれでよさそう。

ただ Branch の数がどういう基準でカウントされているかよくわからない。 全部通っているはずなのに通ってないような。あるいはブランチの母数が大きいのか。

C言語なので --exclude-throw-branches を付けて例外を除外すると落ち着いた気がする。 ASSERT_EQ() などは変わらないのだが、もうテスト関数は無視する。

writer: hiro99ma
tags: C language  

 < Top page

コメント(Google Formへ飛びます)

GitHub

X/Twitter

Homepage

About me