Re: [gcov] No data gathered for child processes

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Holger,

First thanks for your support.

Holger Blasum wrote:
Hello Didier,

On Sat, Sep 19, 2009 at 09:04:54PM +0200, Didier Ptitjes wrote:
GTest forks the test process in order to test for asserting tests.
Looking at the reports of lcov, it looks like there is absolutely no
information gathered about the child processes.
...
I already have seen this question asked two times on gcc-help but none
got a real answer:
http://gcc.gnu.org/ml/gcc-help/2009-07/msg00334.html
http://gcc.gnu.org/ml/gcc/2008-09/msg00490.html

Hmm, I have no quick idea how to fix your problem, but it might be helpful to understand where it occurs (then one can think of a work-around): basically the gcov tools work in a way (1) that enabling -ftest-coverage will result in a different binary
than the binary without -ftest-coverage (1.4.1 in [1]), this gives you
*.gcno files
(2) when the instrumented binary it is run you have a data collection (1.4.2 in [1]) phase where the binary adds up counters in memory whenever passing through C sequence points and then you have a reporting phase where the memory data is dumped into *.gcda files.
(3) then there is a reporting phase (1.4.3 in [1]) where that *.gcda
and *.gcno files are converted into *.gcov files

The first thing to divide and conquer this would be to test and report * whether after the phase (1) all *.gcno files are built for both parent and child, * whether after the phase (2) all *.gcda files are built/modified for parent and child.

OK, I can confirm that I actually have *.gcno and *.gcda files for every of my library .c files. (I tried to build them for test cases themselves without any change).

You must note that the parent process and the child processes have the exact same code. In fact, the parent process is just forked.

For an example of the forking code you can look at:
http://git.gnome.org/cgit/libgee/tree/tests/testreadonlycollection.vala#n121

This is Vala code but it is just transformed into the following C code:

<code>
if (g_test_trap_fork ((guint64) 0, G_TEST_TRAP_SILENCE_STDOUT |
                                     G_TEST_TRAP_SILENCE_STDERR)) {
	g_assert (gee_collection_add (self->ro_collection, "two"));
	_g_object_unref0 (dummy);
	return;
}
g_test_trap_assert_failed ();
g_assert (gee_collection_get_size (self->ro_collection) == 1);
g_assert (gee_collection_contains (self->ro_collection, "one"));
</code>

g_test_trap_fork uses fork() to fork the process.

Here is the g_test_trap_fork code if this can enlighten the problem:
http://git.gnome.org/cgit/glib/tree/glib/gtestutils.c#n1582

I did not yet resolve the problem. I hope I will be able with your help.

Best regards, Didier.


[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux