Troubleshooting Code Coverage

The code coverage analysis tool in Visual Studio collects data for native and managed assemblies (.dll or .exe files). However, in some cases, the Code Coverage Results window displays an error similar to "Empty results generated: ...." There are several possible reasons why this might happen. This topic is intended to help resolve those issues.

If you choose an Analyze Code Coverage command on the Test menu, and if the build and tests run successfully, then you should see a list of results in the Code Coverage window. You might have to expand the items to see the detail.

Code coverage results with coloring

For more information, see Using Code Coverage to Determine How Much Code is being Tested.

You need Visual Studio Ultimate or Visual Studio Premium.

Analysis

Check your output window. In the Show Output from drop-down list, choose Tests. See if there are any warnings or errors logged.

Explanation

Code coverage analysis is done while tests are running. It only includes assemblies that are loaded into memory when the tests run. If none of the tests are executed then there is nothing for code coverage to report.

Resolution

In Test Explorer, choose Run All to verify that the tests run successfully. Fix any failures before using Analyze Code Coverage.

When you modify and re-run your tests, a previous code coverage result can still be visible, including the code coloring from that old run.

  1. Run Analyze Code Coverage.

  2. Make sure that you have selected the most recent result set in the Code Coverage results window.

Analysis

Open the compile target folder (typically bin\debug), and verify that for each assembly, there is a .pdb file in the same directory as the .dll or .exe file.

Explanation

The code coverage engine requires that every assembly has its associated .pdb file accessible during the test run. If there is no .pdb file for a particular assembly, it will not be analyzed.

The .pdb file must be generated from the same build as the .dll or .exe files.

Resolution

Make sure that your build settings generate the .pdb file. If the .pdb files are not updated when the project is built, then open the project properties, select the Build page, choose Advanced and inspect Debug Info.

If the .pdb and .dll or .exe files are in different places, copy the .pdb file to the same directory. It is also possible to configure code coverage engine to search for .pdb files in another location. For more information, see Customizing Code Coverage Analysis.

Analysis

Determine if the binary has undergone any form of advanced optimization such as Profile Guided Optimization, or has been instrumented by a profiling tool such as vsinstr.exe or vsperfmon.exe.

Explanation

If an assembly has already been instrumented or optimized by another profiling tool, the assembly is omitted from the code coverage analysis.

Code coverage analysis cannot be performed on such assemblies.

Resolution

Switch off optimization and use a new build.

Analysis

Verify that you are running some tests on managed or C++ code.

Explanation

Code coverage analysis in Visual Studio is available only on managed and native (C++) code. If you are working with third-party tools, some or all of the code might execute on a different platform.

Resolution

None available.

Analysis

Verify that the assembly is not loaded from the native image cache.

Explanation

For performance reasons, native image assemblies are not analyzed. For more information, see Ngen.exe (Native Image Generator).

Resolution

Use an MSIL version of the assembly. Do not process it with NGen.

Analysis

If you are using a custom .runsettings file, it might contain a syntax error.

This results in no code coverage run at all. Either the code coverage window does not open at the end of the test run, or it shows old results.

Explanation

You can run your unit tests with a custom .runsettings file to configure code coverage options. The options allow you to include or exclude files. For more information, see Customizing Code Coverage Analysis.

Resolution

There are two possible types of faults:

  • XML error

    Open the .runsettings file in the Visual Studio XML editor. Look for error indications.

  • Regular expression error

    Each string in the file is a regular expression. Review each one for errors, and in particular look for :

    • Mismatched parentheses (...) or unescaped parentheses \(...\). If you want to match a parenthesis in the search string, you must escape it. For example, to match a function use: .*MyFunction\(double\)

    • Asterisk or plus at the start of an expression. To match any string of characters, use a dot followed by an asterisk: .*

Analysis

If you are using a custom .runsettings file, make sure that it includes your assembly.

Explanation

You can run your unit tests with a custom .runsettings file to configure code coverage options. The options allow you to include or exclude files. For more information, see Customizing Code Coverage Analysis.

Resolution

Remove all the Include nodes from the .runsettings file, and then remove all the Exclude nodes. If that fixes the problem, put them back in stages.

Make sure the DataCollectors node specifies Code Coverage. Compare it with the sample in Customizing Code Coverage Analysis.

Analysis

In statically linked native code, part of the initialization function DllMain and code that it calls is sometimes shown as not covered, even though the code has been executed.

Explanation

The code coverage tool works by inserting instrumentation into an assembly just before the application starts running. In any assembly loaded before this time, the initialization code in DllMain executes as soon as the assembly loads, and before the application runs. That code will appear to be not covered.

Typically, this applies to statically loaded assemblies.

Resolution

None.

Was this page helpful?
(1500 characters remaining)
Thank you for your feedback
Show:
© 2014 Microsoft