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