Gcov - XCode 5.1 Unit Test Coverage Analysis Fails On Files Using Blocks

De openkb
Aller à : Navigation, rechercher

Sommaire

Questions

Today I was tasked with adding unit test coverage analysis to our code base. Today is also the day iOS 7.1 is released along with XCode 5.1. From the release notes:

The gcov tool for code coverage testing has been reimplemented. The new version uses the llvm-cov tool from the LLVM project. It is functionally equivalent to the old version for all significant features. The location of gcov within Xcode has also moved, use xcrun to invoke it. If you find problems, please file bug reports. For this release, you can still use the old version of gcov from GCC, which is available as gcov-4.2. 11919694 updated

https://github.com/jonreid/XcodeCoverage https://github.com/jonreid/XcodeCoverage

The first hurdle was that the new bundled gcov program doesn t support the -v argument to get the version, which is the first step of lcov s initialization. Seemed like a non-starter already, but reading the release notes above I modified the lcov script to use the old gcov-4.2 version and got that solved.

However, lcov errored out very early in processing my coverage data files. This generated a report with maybe the first 10 or so files alphabetically in my project. Not particularly useful. The error output was minimal and unhelpful as well:

geninfo: ERROR: GCOV failed for (build_artifacts)/(class_that_errored).gcda!

I modified the lcov script to print the error it was getting (which only yielded 11 unfortunately, couldn t find any reference in the gcov(-io).c code) and to continue operation instead of quitting, so I was left with a lot more files in the report, but still probably 85% of my source files had errored out as above.

The only pattern I could discern between the files that successfully wound up in the report and the ones that threw an error was that any file that used an in-line block declaration failed. None of the files that passed used blocks in any fashion, and all the files I ve checked that failed contain blocks. Strange.

https://code.google.com/p/coverstory/ https://code.google.com/p/coverstory/

(class_that_errored).gcno:no lines for __copy_helper_block_ (class_that_errored).gcno:no lines for __destroy_helper_block_

My best hypothesis at this point is that the new XCode 5.1 is generating .gcda files that the old gcov-4.2 program isn t equipped to deal with regarding block declarations.

But I ve exhausted everything I can think to try, so I m here to ask if anybody has a piece of knowledge that I ve missed, or has any ideas to further the debugging effort. Or if anyone is successfully measuring test coverage since today s XCode 5.1 update with the new gcov, I d love to hear about any changes you had to make as well.

Answers

The problem is in the LCOV 1.10 geninfo script. It tests for the current version of gcov. It does this by parsing the version string. Since gcov now points to llvm-cov, the version string is parsed incorrectly.

The solution is to modify geninfo ’s get_gcov_version() subroutine. In line 1868 , change -v to --version. Then replace line 1874 with:

if ($version_string =~ m/LLVM/)
{
    info("Found llvm-cov
");
    $result = 0x40201;
}
elsif ($version_string =~ /(d+).(d+)(.(d+))?/)

 

The modified subroutine should look like this:

sub get_gcov_version()
{
    local *HANDLE;
    my $version_string;
    my $result;

    open(GCOV_PIPE, "-|", "$gcov_tool --version")
        or die("ERROR: cannot retrieve gcov version!
");
    $version_string = <GCOV_PIPE>;
    close(GCOV_PIPE);

    $result = 0;
    if ($version_string =~ m/LLVM/)
    {
        info("Found llvm-cov
");
        $result = 0x40201;
    }
    elsif ($version_string =~ /(d+).(d+)(.(d+))?/)
    {
        if (defined($4))
        {
            info("Found gcov version: $1.$2.$4
");
            $result = $1 << 16 | $2 << 8 | $4;
        }
        else
        {
            info("Found gcov version: $1.$2
");
            $result = $1 << 16 | $2 << 8;
        }
    }
    return ($result, $version_string);
}

 

NOTE: Make sure --gcov-tool is not set to gcov-4.2.

Source

License : cc by-sa 3.0

http://stackoverflow.com/questions/22343725/xcode-5-1-unit-test-coverage-analysis-fails-on-files-using-blocks

Related

Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Outils