I have been experimenting with understand how code coverage works for a project compiled using VC++ on Windows. The steps are:
- build with /LINK PROFILE
- vsinstr /coverage foobar.exe
- vsperfcmd /start:coverage /output:run.coverage
- foobar.exe
- vsperfcmd /shutdown
This leaves me with a file run.coverage in a proprietary binary format. How can I convert this into cobertura format (or something equally useful)?
Things I have tried:
Use tools only available in the enterprise edition of visual studio (which I don't have) https://learn.microsoft.com/en-us/visualstudio/test/microsoft-code-coverage-console-tool?view=vs-2022
Use a .NET package from Microsoft called code.coverage as suggested here
I could not get this to work. I managed to download the package but when I run it as suggested it just returns and does nothing.
C:\Users\SomeUser\AppData\Local\FineCodeCoverage\msCodeCoverage\17.1.0\build\netstandard1.0\CodeCoverage\amd64\CodeCoverage.exe" analyze /output:coverage.xml run.coverage
It may be assuming some familiarity with .NET, NUGET etc that I don't have.
Some old questions (linked below) pointed me at https://github.com/jsargiot/visual-coverage which is no longer maintained and I was unable to compile.
The following questions are somewhat out of date:
- Can Microsoft code coverage tool generate XML file as a report format?
- Convert MSTest code covarage results in to XML
My main background is Linux where I just use -fcoverage -fprofile-arcs with gcc and govr This is partly about understanding the windows ecosystem. Related questions I have:
What is the binary coverage format (It starts with the magic number MIKE\0P)?
Is this really the best way to get coverage information on Windows? I get the feeling vsinstr + vsperfcmd is deprecated.
I tried using https://github.com/OpenCppCoverage/OpenCppCoverage It seems to work and generate line coverage information. It does not require the executable to be instrumented via
vsinstr. It does not support branch coverage (I don't know of vsperfcmd does either) I will likely default to using this until I discover something better.Is there an equivalent compile option to "-fprofile-arcs -fcoverage" Is there something beyond /LINK PROFILE that would render vsinstr redundant
Is this a waste of time compared to using clang-cl as the platform toolkit? I could then use llvm-cov, see https://marco-c.github.io/2018/01/09/code-coverage-with-clang-on-windows.html