To test & explore gcov/lcov functionality for user space applications, here are the steps I used:
- I wanted to get coverage for a few android tools that I ported to linux a while ago. Here is the code: https://github.com/babuneelam/gcov_uspace_tests. Here is the structure of my applications' source code:
root@babu-VirtualBox:~/gcov_tests#
ls -LR
.:
bin
latencytop Makefile sane_schedstat showmap
./bin:
./latencytop:
DumpGcovData
latencytop.c Makefile
./sane_schedstat:
Makefile
sane_schedstat.c
./showmap:
Makefile
showmap.c
root@babu-VirtualBox:~/gcov_tests#
- To instrument the code with gcov, I enabled gcov compilation flags in two applications latencytop & sane_schedstat. I also turned off any gcc optimization by removing "O" flags :
root@babu-VirtualBox:~/gcov_tests# grep -irne
"-fprofile-arcs" *
latencytop/Makefile:6:CFLAGS
= -fPIC -pedantic -fprofile-arcs -ftest-coverage -march=native -ggdb3
sane_schedstat/Makefile:6:CFLAGS
= -fPIC -pedantic -fprofile-arcs -ftest-coverage -march=native -ggdb3
root@babu-VirtualBox:~/gcov_tests#
- I compiled all the applications from top directory:
root@babu-VirtualBox:~/gcov_tests# make
- After compilation, I see that gcc generated .gcov files in the two applications instrumented with gcov flags:
root@babu-VirtualBox:~/gcov_tests#
ls -LR
.:
bin
latencytop Makefile sane_schedstat showmap
./bin:
latencytop
sane_schedstat showmap
./latencytop:
latencytop.c
latencytop.gcno
latencytop.o Makefile
./sane_schedstat:
Makefile
sane_schedstat.c sane_schedstat.gcno
sane_schedstat.o
./showmap:
Makefile
showmap.c showmap.o
root@babu-VirtualBox:~/gcov_tests#
- I then executed latencytop & sane_schedstat binaries in two different terminals. Both these applications run in a loop. So, these commands kept looping in those terminals.
- I then dumped gcov run time date using a custom script I wrote - https://github.com/babuneelam/gcov_scripts/blob/master/dump_gcov. This script basically attaches to the process through gdb & flushes gcov run time data & then detaches from gdb.
root@babu-VirtualBox:~/gcov_tests# ./dump_gcov latencytop sane_schedstat
Application: latencytop
Dumping gcov data...
Gcov data dump complete.
Application: sane_schedstat
Dumping gcov data...
Gcov data dump complete.
root@babu-VirtualBox:~/gcov_tests#
Application: latencytop
Dumping gcov data...
Gcov data dump complete.
Application: sane_schedstat
Dumping gcov data...
Gcov data dump complete.
root@babu-VirtualBox:~/gcov_tests#
- After this, I see that dump_gcov script generated .gcda files in the two applications instrumented with gcov flags.
root@babu-VirtualBox:~/gcov_tests# ls -LR
.:
bin dump_gcov latencytop
Makefile sane_schedstat showmap
./bin:
latencytop sane_schedstat showmap
./latencytop:
DumpGcovData latencytop.gcda
latencytop.o
latencytop.c latencytop.gcno
Makefile
./sane_schedstat:
Makefile
sane_schedstat.gcda sane_schedstat.o
sane_schedstat.c sane_schedstat.gcno
./showmap:
Makefile showmap.c showmap.o
root@babu-VirtualBox:~/gcov_tests#
- In case the test machine is different from the build machine, then an additional step of bringing the run time gcov information from test machine to build machine is required. I have automated this step using a script - https://github.com/babuneelam/gcov_scripts/blob/master/fetch_n_merge_gcov. One can use this script from build machine in any build sub-directory to update corresponding directory's run time coverage info from the test machine. Below is the usage info of this script. Use this with "--remote --uinfo" options. I am not doing this step now as my test & build machines are the same.
root@babu-VirtualBox:~/gcov_tests/lkm# ./fetch_n_merge_gcov
Usage: fetch_n_merge_gcov --[local/remote] --kinfo --uinfo
[--kp <kdir_prefix>] [--up <udir_prefix>]
Execute this script from any build sub-directory to update
corresponding run time coverage info
root@babu-VirtualBox:~/gcov_tests/lkm#
- The, from my top build directory, I ran the following lcov commands:
root@babu-VirtualBox:~/gcov_tests# geninfo
. -o ./coverage.info
Found gcov version: 4.8.1
Scanning . for .gcda files ...
Found 2 data files in .
Processing latencytop/latencytop.gcda
Processing sane_schedstat/sane_schedstat.gcda
Finished .info-file creation
root@babu-VirtualBox:~/gcov_tests#
root@babu-VirtualBox:~/gcov_tests# ls
bin coverage.info
dump_gcov latencytop Makefile sane_schedstat
showmap
root@babu-VirtualBox:~/gcov_tests#
root@babu-VirtualBox:~/gcov_tests# genhtml -o
./lcov_data/ ./coverage.info
Reading data file ./coverage.info
Found 2 entries.
Found common filename prefix
"/home/babu"
Writing .css and .png files.
Generating output.
Processing file
gcov_tests/latencytop/latencytop.c
Processing file
gcov_tests/sane_schedstat/sane_schedstat.c
Writing directory view page.
Overall coverage rate:
lines......: 56.8% (155 of 273 lines)
functions..: 69.6% (16 of 23 functions)
branches...: 43.7% (52 of 119 branches)
root@babu-VirtualBox:~/gcov_tests#
root@babu-VirtualBox:~/gcov_tests# ls -LR
lcov_data/
lcov_data/:
amber.png gcov_tests
index-sort-b.html ruby.png
emerald.png glass.png
index-sort-f.html snow.png
gcov.css index.html
index-sort-l.html updown.png
lcov_data/gcov_tests:
latencytop sane_schedstat
lcov_data/gcov_tests/latencytop:
index.html
index-sort-l.html latencytop.c.gcov.html
index-sort-b.html latencytop.c.func.html
index-sort-f.html
latencytop.c.func-sort-c.html
lcov_data/gcov_tests/sane_schedstat:
index.html
sane_schedstat.c.func.html
index-sort-b.html
sane_schedstat.c.func-sort-c.html
index-sort-f.html
sane_schedstat.c.gcov.html
index-sort-l.html
root@babu-VirtualBox:~/gcov_tests#
- I used firefox to view code coverage information of my tests.
root@babu-VirtualBox:~/gcov_tests# firefox ./lcov_data/index.html
- For reference, I hosted my code coverage results on my google drive - https://googledrive.com/host/0B4xkNcpT6Zbdb2gzZUlfOURJcTg/. Here is the top level screen:
- Among the three applications I have, lcov report included only those applications instrumented with gcov. So, engineers should NOT be hasty in concluding the coverage information based on just lcov report, but should cautiously check whether all the code expected to be compiled with gocv flags is compiled so. Any code that is not compiled with gcov flags should be categorized "unknown coverage".
Hope this helps.
No comments:
Post a Comment