OpenCppCoverageとは?
- カバレッジを算出してくれるオープンソース(GitHub)
- visual studioのプラグインもある(2019まで)
OpenCppCoverageの全体
処理の流れとしては上図のようになっており5Stepからなる。
- 分析対象のexeファイルから、exe作成に使用された.hファイル.cpp/.cファイル情報(ファイル名/行数/行数の仮想アドレス)の取得
- 仮想アドレスを物理アドレスに変換し、各ポイントにブレイクポイントをはる
- 分析対象のexeの処理を実行開始
- ブレイクポイントのイベントを補足し、ブレイクポイントをはった行数を通過したという情報を蓄積していく
- 行数と通過した/通過していないの情報をまとめて、カバレッジ情報を作成する
使用されている技術
- DIA(Debug Interface Access)というAPI
- exeやpdbファイルから様々な情報を取得できる
- DIA SDK
①.exeからファイル情報の抽出
-
抽出できる情報
DIA SDKのサンプルプロジェクトをビルドして作成したDia2dump.exeで抽出可能な情報を表示してみた。OpenCppCoverageでも同じAPIを使用して情報を抽出している。
様々な情報が抽出できていることが分かる。
OpenCppCoverageで使用している情報はLINESの情報。
どのファイルのどの行数が仮想アドレスに格納されているかの情報が得られている模様。
仮想アドレスとモジュールのbaseOfImageの値からアドレスの値を求め、アドレスの値とライン行数の対応vectorを作成
②ブレイクポイントのSet
③.exeの実処理実行
実行が始まる
④ブレイクポイントイベントの補足と通過情報の蓄積
デバッグ時のイベント補足にはWaitForDebugEvent()を使う
EXCEPTION_DEBUG_EVENT(1)のEXCEPTION_BREAKPOINTを使う
ことでブレイクポイントイベントを補足できる。
OnBreakPoint()の中でブレイクポイントが止まった(通過した)行に通過した情報を残す
⑤カバレッジ情報の作成
④で通過した行には通過した情報が残っており、通過していない行は通過していないの状態のままなので、この情報を使って、カバレッジ情報を作成する
OpenCppCoverageのデバッグ環境構築
GitHubをcloneしてビルドすると以下のエラーが表示される。
thirdParty1.4.0.nupkgをダウンロードして、エラーで指摘されているパスに置き、パッケージの復元をNuGetパッケージの管理から行うとデバッグ実行可能な状態になる。
- 環境 visual studio 2019