Kernel code coverage - ligurio/openbsd-tests GitHub Wiki
How-To
- Requirements:
pkg_add p5-File-Slurp scapy python2.7 p5-IO-Socket-INET6
sysctl net.inet.ip.forwarding=1
sysctl net.inet.etherip.allow=1
- build kernel with enabled kcov(4) support, enabled profiler(?) (
config -p
) and option '-ftest-coverage' (see /usr/src/sys/arch/uname -m
/conf/Makefile.uname -m
) - reboot to the new kernel and make sure kcov-example app works (see kcov(4))
- download lcov http://downloads.sourceforge.net/ltp/lcov-1.13.tar.gz
- create baseline coverage data file:
lcov --capture --initial --directory /usr/obj/sys/arch/amd64/compile/GENERIC.MP.kcov/ --output-file kernel_base.info
- build
kcovprint
- perform regression tests
SUDO="LD_PRELOAD=/root/kcovprint/libkcovprint.so.1.0.0" make > sys_coverage.txt
KERNEL=$(dmesg | sed -n '2p' | cut -d':' -f2)/bsd.gdb
xargs -n 100 -P 10 -J % addr2line -e /usr/src/sys/arch/amd64/compile/GENERIC.MP.kcov/obj/bsd.gdb % < kernel_test.addr
- convert addr2line to test coverage data file:
./addr2info < kernel_test.resolved > kernel_test.info
- combine baseline and test coverage data:
lcov -a kernel_base.info -a kernel_test.info --output-file kernel_total.info
- generate HTML report:
genhtml --prefix /usr/src/sys --ignore-errors source kernel_total.info --legend --title "commit SHA1" --output-directory=coverage-html
Example of using kcov(4) http://cvsweb.openbsd.org/cgi-bin/cvsweb/src/regress/sys/dev/kcov/kcov.c?rev=1.1&content-type=text/x-cvsweb-markup