4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

OpenCppCoverageは如何にしてカバレッジ計測しているか

Posted at

OpenCppCoverageとは?

  • カバレッジを算出してくれるオープンソース(GitHub
  • visual studioのプラグインもある(2019まで)
    image.png
    image.png

OpenCppCoverageの全体

image.png
処理の流れとしては上図のようになっており5Stepからなる。

  1. 分析対象のexeファイルから、exe作成に使用された.hファイル.cpp/.cファイル情報(ファイル名/行数/行数の仮想アドレス)の取得
  2. 仮想アドレスを物理アドレスに変換し、各ポイントにブレイクポイントをはる
  3. 分析対象のexeの処理を実行開始
  4. ブレイクポイントのイベントを補足し、ブレイクポイントをはった行数を通過したという情報を蓄積していく
  5. 行数と通過した/通過していないの情報をまとめて、カバレッジ情報を作成する

使用されている技術

  • DIA(Debug Interface Access)というAPI
    • exeやpdbファイルから様々な情報を取得できる
    • DIA SDK

①.exeからファイル情報の抽出

  • 情報の抽出対象としたexeファイル
    以下のようなfunction.cppファイル
    image.png

  • 抽出できる情報
    DIA SDKのサンプルプロジェクトをビルドして作成したDia2dump.exeで抽出可能な情報を表示してみた。OpenCppCoverageでも同じAPIを使用して情報を抽出している。
    様々な情報が抽出できていることが分かる。
    OpenCppCoverageで使用している情報はLINESの情報。
    どのファイルのどの行数が仮想アドレスに格納されているかの情報が得られている模様。
    image.png

一般的にPE形式に含まれる情報は以下のようになっている

image.png 

  • OpenCppCoverageのコード
    ④の関数がメインなのでそこを深堀していく
    image.png
    image.png

    • EnumetrateCollection
      EnumetrateCollectionの引数は*sourceFilesとラムダ式。
      sourceFilesから1ファイルが取りだされて、ラムダ式が実行されていく
      image.png

      • EnumLines():ラムダ式の中で実行されている関数
        image.png
        image.png

        • OnNewLines
          lines_に行数と、仮想アドレス、シンボルIndexが追加されていく。
          ファイル情報の抽出は完了。

        image.png
        image.png

       得られた行数と、仮想アドレス、シンボルIndexの例
       image.png

  • OnSorceFile

    ブレイクポイントをSetすることが役割
    image.png

仮想アドレスとモジュールのbaseOfImageの値からアドレスの値を求め、アドレスの値とライン行数の対応vectorを作成

②ブレイクポイントのSet

  • SetBreakPoint:OnNewLines()の中でcallされている
    ここまでに求めた行数に対応するアドレスに対してブレイクポイントをSetしていく
    image.png
    image.png

③.exeの実処理実行

実行が始まる

④ブレイクポイントイベントの補足と通過情報の蓄積

デバッグ時のイベント補足にはWaitForDebugEvent()を使う

EXCEPTION_DEBUG_EVENT(1)のEXCEPTION_BREAKPOINTを使う
ことでブレイクポイントイベントを補足できる。
OnBreakPoint()の中でブレイクポイントが止まった(通過した)行に通過した情報を残す
image.png

⑤カバレッジ情報の作成

④で通過した行には通過した情報が残っており、通過していない行は通過していないの状態のままなので、この情報を使って、カバレッジ情報を作成する

OpenCppCoverageのデバッグ環境構築

GitHubをcloneしてビルドすると以下のエラーが表示される。
image.png

thirdParty1.4.0.nupkgをダウンロードして、エラーで指摘されているパスに置き、パッケージの復元をNuGetパッケージの管理から行うとデバッグ実行可能な状態になる。

  • 環境 visual studio 2019
4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?